Aws lambda 如何从errormessage中插入头

Aws lambda 如何从errormessage中插入头,aws-lambda,aws-api-gateway,Aws Lambda,Aws Api Gateway,我一直在尝试为错误响应状态(和失败)注入自定义头 我使用了一个非常简单的lambda exports.handler = (event, context, callback) => { // TODO implement //callback(null, 'Hello from Lambda'); var error = { name:"error", message:"I am a failure", statusCode

我一直在尝试为错误响应状态(和失败)注入自定义头

我使用了一个非常简单的lambda

exports.handler = (event, context, callback) => {
   // TODO implement

   //callback(null, 'Hello from Lambda');

   var error = {
       name:"error", 
       message:"I am a failure",
       statusCode: 400
   };

   error["x-test"] = 'foo';

   callback(JSON.stringify(error), null);
};
在api网关中,我完成了以下操作:

设置CORS以包括x-测试 responsetemplate=
“$input.path('$.errorMessage')”
响应参数包括:

method.response.header.x-test = integration.response.body.x-test
另外,我使用
'.*statusCode.*400.*'

结果是空的

所以我决定退后一步,看看如果我这样做会发生什么:

method.response.header.x-test = integration.response.body
我发现我得到了errorMessage的严格响应

{"x-test":"{\"errorMessage\":\"{\\\"name\\\":\\\"error\\\",\\\"message\\\":\\\"I am a failure\\\",\\\"statusCode\\\":400,\\\"x-test\\\":\\\"foo\\\"}\"}"}
因此,我决定更改responsetemplate,通过执行以下操作将其强制转换为json:

responsetemplate=
“$util.parseJson($input.path('$.errorMessage'))”

我仍然得到严格的回答:

{"x-test":"{\"errorMessage\":\"{\\\"name\\\":\\\"error\\\",\\\"message\\\":\\\"I am a failure\\\",\\\"statusCode\\\":400,\\\"x-test\\\":\\\"foo\\\"}\"}"}
我的猜测是,它没有像预期的那样进行转换,而只是针对最终输出

那么,您如何获取一个值并将其放入标题中呢

谢谢,
Kelly

我认为这更像是一种设计选择,考虑到Lambda和APIGateway施加的限制。我会尽我最大的努力去思考

首先,在Lambda中,回调(error,result)函数可以将错误字符串作为第一个参数,也可以将对象作为结果响应。如果您想传递一条简单的错误消息,您完全可以这样做。然而,在您的例子中,当您试图传递整个错误对象时,选择第二个选项显然是一个更好的解决方案(与字符串化对象并再次将其解析为对象相比)。因此,Lambda函数的最后一行应该是:

回调(空,错误)

是的,在这种情况下,如果在Lambda中测试函数,输出结果将不再是红色并将其标记为错误,但这并不重要,因为您可以在APIGateway中格式化头和响应

现在需要在APIGateway中进行设置,在其中需要利用Lambda传递的对象

实际上,使用方法执行接口来配置头非常容易

  • 方法响应中,您需要为特定状态代码添加要包含在响应中的标题,在您的情况下是x-test。(如果希望API返回不同的状态代码,也可以在此面板中进行配置。)

  • 然后转到集成响应,在相同的状态代码下,您将看到添加的标题可用。根据AWS的文档,您可以使用
    integration.response.body.JSONPath_EXPRESSION
    来分配头值(这是您应该在Lambda中返回object而不是string的另一个原因,因为在这个阶段没有从string解析object的正式API)。这一次,当Lambda通过一个对象时,x-test头的值为:

integration.response.body['x-test']

  • 现在,您的API应该包含正确的标头
注意:为了在APIGateway中设置不同的状态代码,您应该在响应正文中留下一些可区分的数据字段(您的状态代码:400应该可以正常工作),以便使用正则表达式将这些字段与特定的状态代码相匹配

所以。。。以上内容不适用于成功消息。通过讨论错误处理设计模式,我发现了这一点。显然,他们所建议的只是在出现错误时映射状态代码,在这种情况下,不应传递正文(仅传递errorMessage),因为浏览器无论如何都不会关心状态代码以外的响应正文


我想,毕竟,Lambda向APIGateway传递对象时,不可能同时自定义状态代码和头?

这是因为您正在串接来自Lambda函数的错误对象。API网关试图解析JSON路径表达式,但无法在字符串中计算“x-test”。如果返回的是对象而不是字符串,则应该可以

您可能想考虑使用允许您直接从lambda函数控制标题和状态的方法。


更新:我已经用示例代码写了一篇关于这个主题的博客文章@

我将使用与您相同的路径
回调(null,错误)1。非常感谢。2.我真的在努力确定问题/如果有的话,并以此为方向(复杂化等)3。再次感谢:)因此,如果我一直试图使其成功(通过传递错误对象),那么看起来似乎存在问题。我好像没法把400号地图画出来。从我所读到的lambda正则表达式中,将集成响应绑定到响应仅适用于errorMessage属性。是否有其他方法可以通过成功语句处理此问题?您可以对错误执行此操作,但您将被限制为仅在回调中以字符串形式发送头值,然后使用“integration.response.body.errorMessage”进行映射。请看@KellyTheDev中的第二个示例,我认为您是对的,我想结论是,如果您将对象从Lambda传递到APIGateway,则无法自定义状态代码(但可以自定义标题)。另一方面,如果传递错误消息,您可以自定义状态代码(头不可能)。嗨,Ryan,代理看起来是一个通配符。有没有办法限制它?目前没有,但您可以将代理路径与静态父/子资源相结合感谢Ryan提供的所有帮助。看来这是唯一的选择。虽然我确实理解它背后的设计。很遗憾,它被锁定,不允许使用errormessage转换头。AWS为您提供了所有这些灵活性,然后他们决定让这不是一个选项。之所以这样做很好,是因为我们希望为整个事务或请求/响应流输出一个唯一标识符,它类似于aws’,但跨越了