AWS Lambda:如何设置错误类型?

Mon*_*key 4 amazon-web-services aws-lambda aws-api-gateway

我想从我的 lambda 函数发送回自定义错误类型。如何控制 errorType 属性中显示的内容,以便将错误返回到我的 api 网关?

 var err = new Error('foo');
 context.fail(err);
Run Code Online (Sandbox Code Playgroud)

返回

{
  "errorMessage": "foo",
  "errorType": "Error",
  "stackTrace": [
    "exports.handler (/var/task/index.js:11:19)"
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想操纵它,以便响应中的 errorType 可以是类似"InvalidParam".

Mic*_*oin 5

返回的 errorType 表示在错误上设置的 'name' 属性。

所以下面的代码:

var error = new Error('Its an error!');
error.name = 'TheName';

context.fail(error);
Run Code Online (Sandbox Code Playgroud)

导致从 Lambda 到 API Gateway 的以下响应:

{
  "errorMessage": "Its an error!",
  "errorType": "TheName",
  "stackTrace": [
    "exports.handler (/var/task/index.js:10:21)"
  ]
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,API 网关似乎只将 Error Regex 与“errorMessage”属性匹配。至少基于我的尝试和到目前为止我所阅读的内容。因此,如果您尝试映射到状态代码,则设置错误类型将无济于事。(如评论中所述)

获得两全其美的一种方法是在调用 context.fail 时“toString()”你的错误。这会将您的错误消息格式化为“[name]:[error message]”。

然后,您可以将 API 网关错误正则表达式与特定的错误“名称”属性进行匹配。

所以调用:

var error = new Error('Its an error!');
error.name = 'TheName';

context.fail(error.toString());
Run Code Online (Sandbox Code Playgroud)

当 API Gateway Regex 映射到状态 500 时:

TheName.*
Run Code Online (Sandbox Code Playgroud)

导致以下状态 500 API 网关响应:

{
  "errorMessage": "TheName: Its an error!"
}
Run Code Online (Sandbox Code Playgroud)