我正在使用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)"
]
}
答案 0 :(得分:1)
好的,似乎这里发生了一些事情。
首先,期望您的处理程序返回一个可以由lambda调用的函数。在这种情况下,您要调用处理程序,而不是返回要由lambda调用的函数。
要解决此问题,请删除run
中task.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');
};