Node.js 14.x版Lambda函数无后续日志输出且返回null是什么原因?
问题根因
你的代码核心问题是异步操作执行时序不匹配,具体问题点如下:
lambda.getProvisionedConcurrencyConfig是异步IO方法,你传入的回调函数会在AWS接口请求完成后才触发,但是你的async handler没有等待这个异步操作完成,就直接执行了return response- 执行return的时候回调还未运行,
response变量没有被赋值,所以函数返回null;同时Lambda会在return后立刻冻结执行上下文,回调里的所有日志打印逻辑都不会被执行,所以你只能看到console.log(event)的输出 - 你混用了async handler模式和回调模式:Lambda的async handler默认会等待返回的Promise resolve,你既没有用await等待异步操作,也没有通过传入的callback参数返回结果,直接同步返回了未赋值的变量
修复方案
方案1(推荐):适配async handler,改用Promise + await写法
AWS SDK v2的所有方法都支持调用.promise()转为Promise对象,配合async/await语法符合现代Node.js写法,逻辑更清晰:
var AWS = require("aws-sdk"); var lambda = new AWS.Lambda(); exports.handler = async function(event, context) { var params = { FunctionName: 'Myfunction', Qualifier: 'v1' }; console.log(event); let response; try { const data = await lambda.getProvisionedConcurrencyConfig(params).promise(); console.log('Success'); console.log(data); response = { statusCode: 200, body: JSON.stringify(data), }; } catch (err) { console.log('error occured'); console.log(err, err.stack); response = { statusCode: 200, body: JSON.stringify(err), }; } return response; };
方案2:保留回调写法,移除async关键字通过callback返回结果
如果你要继续用回调模式,需要移除handler的async关键字,在回调内部调用传入的callback参数返回结果,Lambda会等待callback触发后才结束函数执行:
var AWS = require("aws-sdk"); var lambda = new AWS.Lambda(); exports.handler = function(event, context, callback) { var params = { FunctionName: 'Myfunction', Qualifier: 'v1' }; console.log(event); lambda.getProvisionedConcurrencyConfig(params, function(err, data) { console.log('entered call'); let response; if (err){ console.log('error occured'); console.log(err, err.stack); response = { statusCode: 200, body: JSON.stringify(err), }; } else{ console.log('Success'); response = { statusCode: 200, body: JSON.stringify(data), }; console.log(data); } callback(null, response); }); };
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

