【问题标题】:Why would this AWS lambda cause error: WARNING: Callback/response already delivered为什么此 AWS lambda 会导致错误:警告:回调/响应已交付
【发布时间】:2020-03-03 19:45:07
【问题描述】:
  • 我为signUpamazon-cognito-identity-js 创建了一个API Gateway + lambda。
  • 然后我使用 Typescript 为 preSignUp 实现了 Cognito 触发功能

我使用无服务器框架来打包和部署。运行时是节点 12

+++++++

  const wrapperHandler: Handler<CognitoUserPoolEvent> = async (
    event,
    context,
    callback
  ) => {
    let error = null;

    try {
      await myAsyncFunc();
    } catch (e) {
      error = e;
    }

    callback(error, event);
  };

一切正常,它可以将错误返回给实际的端点lambda,然后返回,如果没有错误,将执行逻辑。

但是,这个警告很烦人。

代码用于 CloudWatch 中的 preSignUp

警告:回调/响应已发送。您的函数是否调用了回调并返回了一个承诺?更多详情请见:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

在代码中,我在调用回调之前没有返回任何内容,为什么会发生这种情况?以及如何解决。

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda amazon-cognito serverless-framework


    【解决方案1】:

    作为您的错误消息,您将回调样式与async/await 样式混合在一起,然后它会引发警告。

    我更喜欢使用async/await。也就是说,handler 函数始终是一个 async 函数(带有 async 关键字),然后不调用callback 函数,只返回结果,并且在handler 函数中不需要callback 参数。

    在错误情况下,只需抛出错误(没有try/catch 块)。

    const wrapperHandler: Handler<CognitoUserPoolEvent> = async (
      event,
      context,
      // callback
    ) => {
      // let error = null;
    
      try {
        await myAsyncFunc();
      } catch (e) {
        // error = e;
        // Do something  with your error
        throw e;
      }
    
      // callback(error, event);
      return event; // just return result for handler function
    };
    

    简单来说:

    const wrapperHandler: Handler<CognitoUserPoolEvent> = async (
      event,
      context,
    ) => {
      await myAsyncFunc();
    
      return event;
    };
    
    

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      相关资源
      最近更新 更多