【问题标题】:AWS Lambda with request-promise带有请求承诺的 AWS Lambda
【发布时间】:2019-05-27 14:55:29
【问题描述】:

我正在尝试编写一个使用 request-promise 库发出外部 https 请求的 Lambda 函数。这就是我所拥有的:

exports.handler = async (event, context, callback) => {
    console.log("Starting call: " + event.queryStringParameters.filter);
    console.log("Decoded param: " + decodeURIComponent(event.queryStringParameters.filter));
    var filter = JSON.parse(decodeURIComponent(event.queryStringParameters.filter));
    console.log("Filter: " + filter);
    var ingredients = filter.ingredients;
    var options = {
        uri: 'https://api.*****.com/search',
        qs: {
            app_id: '****',
            app_key: '*****',
            q: ingredients.join(' ')
        },
        json: true
    };
    console.log("Done calling stuff");

    rp(options)
        .then(function(recipes) {
            console.log('Response: ' + recipes);
            var recipesToReturn = [];

            recipes.hits.forEach(function(recipeHit) {
                recipesToReturn.push(objectMapper(recipeHit.recipe, recipeMap));
            });
            console.log('Recipes:', recipesToReturn);
            const response = {
                statusCode: 200,
                body: JSON.stringify(recipesToReturn),
            };
            return JSON.stringify(response);
        })
        .catch(function(err) {
            console.log('Error:', err)
            const response = {
            statusCode: 400,
            body: err,
            };
            return JSON.stringify(response);
        });
};

当我测试 API 网关请求时,我看到:

2019 年 5 月 26 日星期日 16:59:21 UTC:由于配置错误,执行失败:Lambda 代理响应格式错误

我一直在尝试了解 Lambda 代理响应应该如何格式化,并且我假设我在回调或上下文方面遗漏了一些东西,但我无法弄清楚如何使它与 request-promise 库一起工作。

【问题讨论】:

标签: amazon-web-services aws-lambda aws-serverless


【解决方案1】:

在代理集成中,API 网关只是在前端和后端之间传递整个请求和响应。

这是发送到 API 网关的响应 lambda 函数的问题。

对 lambda 的响应应具有以下键值对

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

isBase64Encoded :如果您不使用二进制数据,请将其设置为 false。

statusCode:是由 API Gateway 解释的 HTTP 响应。

body :如果您要发送 JSON,则必须将其转换为字符串。在 node.js 中你可以使用 JSON.stringify() 方法。

以下可能是对 API Gateway 的正确响应

const response = {
                statusCode: 200,
                isBase64Encoded: false
                headers:""
                body: JSON.stringify(recipesToReturn),
            };

【讨论】:

  • 问题是响应对象中的键周围没有引号。一旦我添加了引号,它就起作用了。
猜你喜欢
  • 2015-02-21
  • 1970-01-01
  • 2016-10-15
  • 2019-09-17
  • 2019-06-05
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
相关资源
最近更新 更多