Lambda只返回200个响应代码



我已经创建了一个示例lambda函数来产生成功&错误的反应。函数如下

exports.handler = (event, context, callback) => {
if(event.val1=="1")
{
 callback(null, 'success');
}else
{
 callback(true, 'fail');
}
};

当我使用API网关测试这个函数时,我得到了不同的响应体,但响应代码是相同的(总是返回200 ok响应代码)。

是否可以自定义状态码从lambda函数(例如:需要500的错误响应&200表示成功响应)?

你可能想看看API Gateway新的简化Lambda代理功能。

使用这个你可以定义你的状态码,直接从你的Lambda返回头和正文内容。

示例来自docs:

'use strict';
console.log('Loading hello world function');
exports.handler = function(event, context) {
    var name = "World";
    var responseCode = 200;
    console.log("request: " + JSON.stringify(event));
    if (event.queryStringParameters !== null && event.queryStringParameters !== undefined) {
        if (event.queryStringParameters.name !== undefined && event.queryStringParameters.name !== null && event.queryStringParameters.name !== "") {
            console.log("Received name: " + event.queryStringParameters.name);
            name = event.queryStringParameters.name;
        }
        if (event.queryStringParameters.httpStatus !== undefined && event.queryStringParameters.httpStatus !== null && event.queryStringParameters.httpStatus !== "") {
            console.log("Received http status: " + event.queryStringParameters.httpStatus);
            responseCode = event.queryStringParameters.httpStatus;
        }
    }
    var responseBody = {
        message: "Hello " + name + "!",
        input: event
    };
    var response = {
        statusCode: responseCode,
        headers: {
            "x-custom-header" : "my custom header value"
        },
        body: JSON.stringify(responseBody)
    };
    console.log("response: " + JSON.stringify(response))
    context.succeed(response);
};

为了从AWS API GW发送自定义错误代码,您应该在集成响应中使用响应映射模板。你基本上为你想从API GW返回的每个状态码定义一个正则表达式。

步骤:

  • 为每个状态码定义方法响应AWS文档
  • 为每个映射到正确方法响应的状态定义集成响应RegEx

使用此配置,API GW返回给客户端的HTTP返回码是与"selectionPattern"中的正则表达式匹配的。

最后我强烈建议使用API GW框架来处理这些配置,Serverless是一个非常好的框架。

使用Servereless,你可以定义一个模板如下(serverless 0.5 snippet):

myResponseTemplate:
application/json;charset=UTF-8: |
#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage'))) {
    "status" : $errorMessageObj.status,
    "error":{
        "error_message":"$errorMessageObj.error.message",
        "details":"$errorMessageObj.error.custom_message"
    }
}
responsesValues:
'202':
  selectionPattern: '.*"status": 202.*'
  statusCode: '202'
  responseParameters: {}
  responseModels: {}
  responseTemplates: '$${myResponseTemplate}'
'400':
  selectionPattern: '.*"status": 400.*'
  statusCode: '400'
  responseParameters: {}
  responseModels: {}
  responseTemplates: '$${myResponseTemplate}'

然后简单地从lambda返回一个json对象,如下面的python代码片段所示(你可以在nodejs中使用类似的方法):

 def handler(event, context):
     # Your function code ...
     response = { 
         'status':400, 
         'error':{
             'error_message' : 'your message',
             'details' : 'your details'
          }
     }
    return response

我希望这对你有帮助。

g .

相关内容

  • 没有找到相关文章

最新更新