Lambda Nodejs-(node:1)UnhandledPromiseRejectionWarning:#<对象>

时间:2018-10-22 04:10:00

标签: node.js lambda

exports.handler = async (event, context, callback) => {      
      try {

        const { headers, body } = event;

        //This is where I forgot the "await" keyword

        const input = ValidateInput(body); //Returns Promise

        callback(null, true);

      }catch(err){
        console.log(err);
        callback(null, false);
      }
}

当调用一个返回诺言的函数而忘记创建一个await表达式诺言函数调用,而该函数拒绝诺言时,Lambda将此错误记录在cloudwatch中

(node:1) UnhandledPromiseRejectionWarning: #<Object>

解决方法很简单,不要忘了await表达式

const input = await ValidateInput(body); //Return Promise

3 个答案:

答案 0 :(得分:0)

解决方法很简单,不要忘了await表达式

const input = await ValidateInput(body); //Return Promise

答案 1 :(得分:0)

如前所述,解决方案是确保您等待诺言:

const input = await ValidateInput(body);

但是我想我会为为什么会出现添加一些背景信息。

由于Promise可以存储在变量中并可以随时链接,因此该库无法知道Promise链在将来的某个时间是否将具有.catch关联。因此,如果未在事件循环的多次传递中处理被拒绝的Promise,则许多库的默认行为是写入控制台。这就是为什么您在日志中看到它的原因。

通常应将此警告视为暗示您尚未等待应该拥有的东西。在现实中,很少有人会故意看到它。

答案 2 :(得分:0)

AWS文档明确表示您不将callback与异步功能一起使用。

  

第三个参数callback是可以调用的函数   非异步函数发送响应。回调函数需要   两个参数:错误和响应。响应对象必须是   与JSON.stringify兼容。

     

对于异步函数,您将响应,错误或承诺返回给   运行时而不是使用回调。

因此,您可能需要在lambda函数中修复该问题。

查看此处:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html#nodejs-prog-model-handler-callback