如何使用无服务器框架通过 AWS API 网关在 Node.js 中编写的 AWS Lambda 函数上出现 return 错误?

How do I return errors on an AWS Lambda function written in Node.js through the AWS API Gateway using the Serverless framework?

我正在编写供内部使用的 API,这是我第一次使用 serverless framework。我正在 Node.js 中编写一个 Lambda 函数,并使用 AWS API 网关连接到它。

在某些情况下,我想 return 自定义错误消息,并且我正在尝试编写一个允许我这样做的函数。现在,每当 Lambda 进程失败时,我都会从 API 收到一条标准消息。在代码中,如果我尝试使用 process.exit(1) 终止进程,我会收到一个一般性错误,即使我已经 return 使用 callback():

编辑了一个错误
{
    "message": "Internal server error"
}

如果我不使用 process.exit(1),我会在日志中看到我通过 callback() return 编辑的错误,但该过程仍在继续,最终超时:

{
    "message": "Endpoint request timed out"
}

我尝试了几种不同的方法来 return 使用 callback() 方法解决错误,但到目前为止我还没有成功。我试过这个方法:

async function return_error(callback, context, error, returnCode){
  console.error("FATAL ERROR: ", error);
  let ErrorObj = {
    errorType : "InternalServerError",
    httpStatus : 500,
    requestId : context.awsRequestId,
    errorMessage : error
}
  callback(JSON.stringify(ErrorObj));
  process.exit(1);
}

还有这个:

async function return_error(callback, error, returnCode){
  console.error("FATAL ERROR: ", error);
  callback({
    isBase64Encoded: false,
    statusCode: returnCode,
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({"Error Message:": error})
  }, null);
  process.exit(1);
}

(很抱歉两者之间的语法变化很小。)

到目前为止,我无法通过 API return 向用户报告任何错误。我的错误总是被记录下来,并且功能继续。任何帮助,将不胜感激。谢谢!

供参考,我的serverless.yml文件的相关部分:

service: #Name of service


provider:
  name: aws
  runtime: nodejs8.10
  role: #ARN of Iam role

functions:
  screenshot:
    handler: #Name of handler
    timeout: 30
    memorySize: 1280
    reservedConcurrency: 10
    events:
      - http: 
          method: get
          path: #path
          contentHandling: CONVERT_TO_BINARY
          authorizer:
            type: aws_iam

plugins:
  - serverless-plugin-chrome
  - serverless-apigw-binary
  - serverless-apigwy-binary
package:
  exclude:
    - node_modules/puppeteer/.local-chromium/** 

custom:
  apigwBinary:
    types:
      - '*/*'

您的 lambda 函数需要 return 成功,APIgateway 才能检测到您的响应。试试这个:

async function return_error(callback, error, returnCode){
  console.error("FATAL ERROR: ", error);
  callback(null, {
    isBase64Encoded: false,
    statusCode: returnCode,
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({"Error Message:": error})
  });
}

Node.js 的 AWS 错误回调没有像宣传的那样工作。根据 docs,所有需要做的就是确保自定义错误扩展 Error 原型。然而,经过10多个小时的测试,我发现这是完全不正确的。

return 错误回调的唯一方法是 return 除 {"message": "Internal server error"} 之外的任何内容(即如果您的 Lambda 函数从 API 网关触发)就是像成功一样回调错误。

TL;DR:callback(errorResponse, null) 不起作用,但 callback(null, errorResponse) 起作用。