Why would this AWS lambda cause error: WARNING: Callback/response already delivered

Why would this AWS lambda cause error: WARNING: Callback/response already delivered

我使用Serverless框架打包部署。运行时是节点 12

+++++++

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

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

    callback(error, event);
  };

一切正常,它可以return将错误发送到实际的端点lambda,然后returned,如果没有错误,将执行逻辑。

但是,这个警告很烦人。

此代码适用于 CloudWatch

中的 preSignUp

WARNING: Callback/response already delivered. Did your function invoke the callback and also return a promise? For more details, see: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

在代码中,我在调用回调之前没有return任何东西,为什么会这样?以及如何解决。

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

我更喜欢使用 async/await。这意味着,处理函数始终是一个异步函数(带有 async 关键字),然后不调用 callback 函数,只是 return 结果,并且处理函数中不需要 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;
};