无服务器框架 TypeError:e 不是函数 [英] Serverless framework TypeError: e is not a function
问题描述
我正在使用 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屋!