首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无服务器框架TypeError: E不是一个函数

无服务器框架TypeError: E不是一个函数
EN

Stack Overflow用户
提问于 2019-10-30 18:44:37
回答 1查看 4.8K关注 0票数 2

我正在使用serverless-framework在亚马逊网络服务中安排任务。

我的应用程序结构是

代码语言:javascript
复制
|- src
   |- tasks
      |- analytics.task.js
|- tasks.js
|- serverless.yml

analytics.task.js的内容

代码语言:javascript
复制
module.exports.run = (event, context, callback) => {
    console.log('Getting data...');

    console.log('success');
};

出于测试目的,从run方法中删除了所有其他代码。

tasks.js的内容

代码语言:javascript
复制
const analyticsTask = require('./src/tasks/analytics.task');

module.exports.analytics = analyticsTask.run();

serverless.yml的内容

代码语言:javascript
复制
functions:
  analyticsDataProcess:
    handler: tasks.analytics
    description: 'Send analytics data to the backend server'
    events:
      - schedule:
          name: analytics-data-process-task
          description: 'Send analytics data every minute'
          rate: rate(1 minute)
          enabled: true

但在运行任务时,它会给出一个错误

代码语言:javascript
复制
{
    "errorMessage": "e is not a function",
    "errorType": "TypeError",
    "stackTrace": [
        "TypeError: e is not a function",
        "    at /home/user/code/user/qcg-app/serverless_sdk/index.js:9:88073",
        "    at resolve (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/lib/plugins/aws/invokeLocal/index.js:692:30)",
        "    at Promise._execute (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/debuggability.js:411:9)",
        "    at Promise._resolveFromExecutor (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:518:18)",
        "    at new Promise (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:103:10)",
        "    at AwsInvokeLocal.invokeLocalNodeJs (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/lib/plugins/aws/invokeLocal/index.js:645:12)",
        "    at AwsInvokeLocal.invokeLocal (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/lib/plugins/aws/invokeLocal/index.js:155:19)",
        "    at AwsInvokeLocal.tryCatcher (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/util.js:16:23)",
        "    at Promise._settlePromiseFromHandler (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:547:31)",
        "    at Promise._settlePromise (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:604:18)",
        "    at Promise._settlePromiseCtx (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:641:10)",
        "    at _drainQueueStep (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:97:12)",
        "    at _drainQueue (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:86:9)",
        "    at Async._drainQueues (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:102:5)",
        "    at Immediate.Async.drainQueues [as _onImmediate] (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:15:14)",
        "    at runCallback (timers.js:705:18)",
        "    at tryOnImmediate (timers.js:676:5)",
        "    at processImmediate (timers.js:658:5)",
        "    at process.topLevelDomainCallback (domain.js:120:23)"
    ]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-30 22:29:51

好的,这里似乎发生了一些事情。

首先,期望您的处理程序返回一个可由lambda调用的函数。在本例中,您将调用处理程序,而不是返回将由lambda调用的函数。

要解决此问题,请在task.js中删除run后面的括号

代码语言:javascript
复制
const analyticsTask = require('./src/tasks/analytics.task');

module.exports.analytics = analyticsTask.run;

还有另一个问题-- lambda处理程序需要是异步函数。因此,您需要在analytics.task.js中导出为run的函数前面添加async。现在可以删除回调参数了。另一种方法是省略async,但实际调用回调。由于我们倾向于使用较新的节点语法,因此让我们删除回调arg以支持async。

代码语言:javascript
复制
module.exports.run = async (event, context) => {
    console.log('Getting data...');

    console.log('success');
};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58623612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档