无服务器框架TypeError:e不是函数

时间:2019-10-30 10:44:36

标签: serverless-framework serverless

我正在使用serverless-framework计划AWS中的任务。

我的应用程序结构是

|- src
   |- tasks
      |- analytics.task.js
|- tasks.js
|- serverless.yml

analytics.task.js

的内容
module.exports.run = (event, context, callback) => {
    console.log('Getting data...');

    console.log('success');
};

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

tasks.js

的内容
const analyticsTask = require('./src/tasks/analytics.task');

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

serverless.yml

的内容
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

但是在运行任务时,它给出了错误

{
    "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)"
    ]
}

1 个答案:

答案 0 :(得分:1)

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

首先,期望您的处理程序返回一个可以由lambda调用的函数。在这种情况下,您要调用处理程序,而不是返回要由lambda调用的函数。

要解决此问题,请删除runtask.js之后的括号

const analyticsTask = require('./src/tasks/analytics.task');

module.exports.analytics = analyticsTask.run;

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

module.exports.run = async (event, context) => {
    console.log('Getting data...');

    console.log('success');
};