Serverless framework TypeError: e is not a function
Serverless framework TypeError: e is not a function
我正在使用 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');
};
出于测试目的,从 运行 方法中删除了所有其他代码。
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)"
]
}
好的,这里似乎发生了一些事情。
首先,预计您的处理程序 returns 是一个可由 lambda 调用的函数。在这种情况下,您将调用处理程序而不是返回要由 lambda 调用的函数。
为了解决这个问题,去掉task.js
中run
后面的括号
const analyticsTask = require('./src/tasks/analytics.task');
module.exports.analytics = analyticsTask.run;
还有另一个问题 - lambda 处理程序需要是异步函数。因此,您需要在 analytics.task.js
中导出为 run
的函数前面添加 async
。现在您可以删除回调参数。
另一种方法是省略异步,但实际调用回调。由于我们倾向于更喜欢较新的节点语法,因此让我们删除回调参数以支持异步。
module.exports.run = async (event, context) => {
console.log('Getting data...');
console.log('success');
};
Aurelia W 在评论中提到了它,但我想 post 因为它是我的答案。确保您的函数名称与 serverless.yml.
中的名称匹配
太糟糕了,错误没有更具描述性。
我正在使用 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');
};
出于测试目的,从 运行 方法中删除了所有其他代码。
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)"
]
}
好的,这里似乎发生了一些事情。
首先,预计您的处理程序 returns 是一个可由 lambda 调用的函数。在这种情况下,您将调用处理程序而不是返回要由 lambda 调用的函数。
为了解决这个问题,去掉task.js
run
后面的括号
const analyticsTask = require('./src/tasks/analytics.task');
module.exports.analytics = analyticsTask.run;
还有另一个问题 - lambda 处理程序需要是异步函数。因此,您需要在 analytics.task.js
中导出为 run
的函数前面添加 async
。现在您可以删除回调参数。
另一种方法是省略异步,但实际调用回调。由于我们倾向于更喜欢较新的节点语法,因此让我们删除回调参数以支持异步。
module.exports.run = async (event, context) => {
console.log('Getting data...');
console.log('success');
};
Aurelia W 在评论中提到了它,但我想 post 因为它是我的答案。确保您的函数名称与 serverless.yml.
中的名称匹配太糟糕了,错误没有更具描述性。