无服务器框架 TypeError:e 不是函数 [英] Serverless framework TypeError: e is not a function

查看:69
本文介绍了无服务器框架 TypeError:e 不是函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 serverless-framework 在 AWS 中安排任务.

I'm using serverless-framework to schedule tasks in 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 方法中删除了所有其他代码.

Removed all other codes from the run method for testing purpose.

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

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

But when running the task, it is giving an error

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

推荐答案

好吧,这里似乎有一些事情要做.

Okay there seems to be a few things going on here.

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

First, it's expected that your handler returns a function that can be called by lambda. In this case, you're calling the handler instead of returning the function to be called by lambda.

为了解决这个问题,去掉task.js

To solve this problem, remove the parenthesis after run in task.js

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

module.exports.analytics = analyticsTask.run;

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

There's another issue - lambda handlers need to be asynchronous functions. So you'll need to add async in front of the function exported as run in analytics.task.js. Now you can remove the callback argument. The alternative would be to omit async, but actually call the callback. Since we tend to prefer newer node syntax, let's remove the callback arg in favor of async.

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

    console.log('success');
};

这篇关于无服务器框架 TypeError:e 不是函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆