iaf*_*rek 3 node.js aws-lambda aws-api-gateway serverless-framework serverless
我有一个用Node.JS编写的无服务器lambda函数.
返回错误代码的最佳/正确方法是什么?
我现在使用的模式(它的工作原理!)是:
module.exports.endpoint = (event, context, callback) => {
const response = {
statusCode: 404,
body: JSON.stringify({ message: 'Hello World!' })
};
callback(null, response);
}
Run Code Online (Sandbox Code Playgroud)
当我拨打电话时,例如从POSTMAN到我的终端,我得到:
Status: 404 Not Found 这正是我所期待的.
而且,在日志中我可以看到:
Serverless: GET / (?: get)
Serverless: [404] {"statusCode":404,"body":"{\"message\":\"Hello World!\"}"}
Run Code Online (Sandbox Code Playgroud)
这很好用.
令我困扰的是,我正在传递null错误.看看其他一些教程/示例我发现了以下模式:
https://aws.amazon.com/blogs/compute/error-handling-patterns-in-amazon-api-gateway-and-aws-lambda/
https://serverless.com/framework/docs/providers/aws/events/apigateway/
callback ("the sky is falling!");
callback("[BadRequest] Validation error: Missing field 'name'");
callback("[404] Not Found");
callback(new Error('[404] Not found'));
callback(JSON.stringify(myErrorObj));
所有这些都很有意义,你可以指定HTTP状态代码 - 但我最终获得的是HTTP状态代码200.当我查看日志时,我可以看到错误是在200之后:
Serverless: GET / (?: get)
Serverless: Failure: the sky is falling!
Serverless: Replying 200
Serverless: GET / (?: get)
Serverless: Failure: [BadRequest] Validation error: Missing field 'name'
Serverless: Replying 200
Serverless: GET / (?: get)
Serverless: Failure: [404] Not Found
Serverless: Replying 200
Serverless: GET / (?: get)
Serverless: Failure: [404] Not found
Serverless: Replying 200
Serverless: GET / (?: get)
Serverless: Failure: {"errorType":"InternalServerError","httpStatus":500,"message":"An unknown error has occurred. Please try again."}
Serverless: Replying 200
Run Code Online (Sandbox Code Playgroud)
在这个地方我发现了以下解释:https: //github.com/serverless/serverless/issues/4119
如果要在这种情况下使用HTTP错误进行响应,则必须将HTTP错误编码为成功的Lambda响应
以下示例:
Sample 403:
callback(null, { statusCode: 403, body: "Forbidden", headers: { "Content-Type": "text/plain" } });
Sample 404:
callback(null, { statusCode: 400 });
Run Code Online (Sandbox Code Playgroud)
所以这基本上和我一样.为了完整起见,我可以补充说,还有很多使用的例子context.fail(result)或context.succeed(result)- 但是我收集的context内容已被弃用,不应该使用(即使它仍然有效).
有什么用callback(error)?
如果要在这种情况下使用HTTP错误进行响应,则必须将HTTP错误编码为成功的Lambda响应
这种错误处理方式特定于API网关.
就像在传统的Node web服务器(例如express)中一样,你可以使用`throw new Error('Invalid Payload')抛出任何错误,而中间件通常会将其转换为具有正确响应状态的HTTP响应.
在API Gateway Lambda中,这可以像这样编写......
function createResponse(status, body) {
return {
headers: {
'Access-Control-Allow-Origin': '*',
}
statusCode: status,
body: JSON.stringify(body)
}
}
module.exports.endpoint = (event, context, callback) => {
try {
return callback(null, createResponse(200, processEvent(event)))
} except (e)
console.error(e)
return callback(null, createResponse(500, {
error: 'Internal Server Error',
}))
}
Run Code Online (Sandbox Code Playgroud)
基本上,这是一个处理错误.lambda函数成功但请求失败(可能是400,404或500).
您应该始终处理错误,否则如果您的处理程序崩溃(由于运行时错误或语法错误或任何不正确的错误),您的用户将得到您可能不想要的意外响应(500或502).
话虽如此,请记住Lambda不仅用于API网关.callback(error)用于非API网关触发的Lambdas.
例如,如果你有一个SNS触发的Lambda,你可以返回callback('Any error message here'),它会让SNS知道它失败了,所以SNS可以重试调用.
| 归档时间: |
|
| 查看次数: |
4260 次 |
| 最近记录: |