2017-10-11 84 views
1

我有一个无服务器的lambda函数写在Node.JS中。什么是在无服务器lambda中返回HTTP错误代码的正确方法

返回错误代码的最佳/正确方法是什么?

,我现在使用权的模式(!和它的作品)是:

module.exports.endpoint = (event, context, callback) => { 
    const response = { 
     statusCode: 404, 
     body: JSON.stringify({ message: 'Hello World!' }) 
    }; 
    callback(null, response); 
} 

当我拨打电话,例如从邮递员,我的终点,我得到:

Status: 404 Not Found其中正是我所期待的

此外,在日志中我可以看到:

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错误是成功的拉姆达响应

与下面的例子:

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)

回答

1

如果你想在这种情况下,HTTP响应错误的,你必须在HTTP错误编码为成功的拉姆达响应

的错误处理这种方式是特定于API网关。

就像在传统的Node服务器(例如express)中一样,你可以使用throw new Error('Invalid Payload')抛出任何错误,而中间件通常会将它转换成具有正确响应状态的HTTP响应。

在API网关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', 
     })) 
} 

基本上,这是一个处理错误。 lambda函数成功,但请求失败(可能是400,404或500)。您应该总是处理错误,否则如果您的处理程序崩溃(由于运行时错误或语法错误或任何未处理程序错误),您的用户将得到意外的响应(500或502),您可能不会不想要。


这就是说,请记住,Lambda不仅用于API网关。 callback(error)用于非API网关触发的Lambdas。

例如,如果您有SNS触发的Lambda,则可以返回callback('Any error message here'),它会让SNS知道它失败,因此SNS可以重试该调用。

+0

我看到你在最后使用相同的方法:'return callback(null,createResponse)' - 将'null'作为错误传递,然后产生实际的错误。 – iaforek

+0

是的。正如我所说的,您应该为API Gateway Lambdas处理错误。 – dashmug

+0

@iaforek你还有什么困惑? – dashmug

相关问题