我有一个使用Node.JS编写的无服务器Lambda函数。
返回错误代码的最佳/正确方法是什么?
我目前使用的模式 (而且它有效!) 是:
module.exports.endpoint = (event, context, callback) => {
const response = {
statusCode: 404,
body: JSON.stringify({ message: 'Hello World!' })
};
callback(null, response);
}
当我从POSTMAN等工具拨打我的端点时,我会得到以下响应:
状态:404未找到
这正是我所期望的结果。
此外,我可以在日志中看到:
Serverless: GET / (λ: get)
Serverless: [404] {"statusCode":404,"body":"{\"message\":\"Hello World!\"}"}
那很好。
让我困扰的是我正在传递 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
我在这里找到了以下解释: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 });
所以基本上这就是我做事的方式。为了完整起见,我可以补充一下,还有很多例子使用 context.fail(result)
或者 context.succeed(result)
- 但是根据我的了解 context
已经过时了,不应该再使用(即使它仍然有效)。
使用 callback(error)
的意义是什么?
return callback(null, createResponse)
- 将null
作为错误传递,然后实际的错误进入结果。 - iaforek