使用之间的区别 callback(...) 和 context.succeed(...) , 是个 context.succeed(...) 调用将使Lambda等待空事件循环。有关详细信息,请参阅此链接: http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html
callback(...)
context.succeed(...)
在您的代码示例中调用时 callback(...) ,事件循环中仍有来自receivedMessage和callSendAPI的事件。代码不会链接生成的promise并在调用之前“等待”完成 callback(...) 。您还可以构建响应并在两种方法中的每一种中调用回调。
我建议从receivedMessage& callSendAPI,并在处理完所有消息后调用回调。
像这样的东西可能会起作用:
/* This goes inside your handler */ //using Bluebird promises Promise.all(Promise.map(data.entry, pageEntry => { // Iterate over each messaging event return Promise.all( pageEntry.messaging .filter(e => e.message) .map(messagingEvent => receivedMessage(messagingEvent))); })).then(res => callback(null, res)) .catch(err => callback(err)); /* The code above goes in your handler */ function receivedMessage(event) { var senderID = event.sender.id; var messageText = message.text; if (messageText) { var messageData = { recipient: { id: senderID }, message: { text: messageText, metadata: "DEVELOPER_DEFINED_METADATA" } }; return callSendAPI(messageData); } else { return Promise.resolve({}); } } function callSendAPI(messageData) { return request({ uri: 'https://graph.facebook.com/v2.8/me/messages', qs: { access_token: PAGE_ACCESS_TOKEN }, method: 'POST', json: messageData }); }
此文档声明必须在API Gateway lambda代理的情况下设置上下文: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format
我遇到的问题是,在catch上出错时,我没有调用context.fail,它以502坏网关结束,之后不会收到调用。所有路径都必须设置上下文。