本地测试NodeJS版AWS Lambda时回调未触发问题咨询
问题原因
- 你定义的Lambda handler是
async异步函数,Node.js运行时下的AWS Lambda针对async类型的handler会忽略传入的回调参数,而是以函数return的Promise resolve结果作为返回值,不会主动触发你传入的第三个回调函数,所以Response[2]对应的打印逻辑永远不会执行。 - 你调用
process.handler的时候没有等待异步函数执行完成,同步代码直接就执行到了>> END的打印,不会等待回调触发。 - 你传入的回调函数参数顺序也不符合Lambda回调规范,Lambda回调的参数顺序是
callback(error, successResponse),就算回调被触发,你定义的function(response,error)也会把错误值放到第一个参数,响应结果放到第二个参数,无法正常拿到返回值。
修复方案
方案1:保留async handler,去掉回调,用await接收返回值
修改simplerun.js代码如下:
let process = require('./simpletest.js'); // 把执行逻辑放在async函数里用await (async () => { console.log(">> START"); const response = await process.handler({}, {}); console.log(">> Response[2]: " + JSON.stringify(response)); console.log(">> END"); })();
方案2:把handler改成非async模式,使用回调返回结果
修改simpletest.js代码如下:
// 去掉async,使用第三个回调参数返回结果 exports.handler = (event, context, callback) => { console.log('>> Handler called'); const response = { statusCode: 200, body: JSON.stringify('Handler Data') }; console.log('>> Response[1]: ' + JSON.stringify(response)); // 调用回调返回结果,第一个参数是错误位,传null表示成功 callback(null, response); };
两种方案任意选择一种都可以得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

