响应未定义 - aws-api-gateway-client

Posted

技术标签:

【中文标题】响应未定义 - aws-api-gateway-client【英文标题】:Response undefined - aws-api-gateway-client 【发布时间】:2018-08-12 02:22:49 【问题描述】:

我创建了一个 AWS API Gateway 来调用 Lambda 函数来生成随机数:

Lambda 函数:

exports.handler = (event, context, callback) => 
let min = parseInt(event.min);
let max = parseInt(event.max);
let generatedNumber = Math.floor(Math.random() * max) + min;
context.done(null, generatedNumber: generatedNumber);
;

API 网关中用于 get 方法的正文映射模板:


    "min" : $input.params('min'),
    "max" : $input.params('max')

当我访问 API 端点时,如下所示: https://abcdefgh.execute-api.ap-south-1.amazonaws.com/DEV/number?min=10&max=20

我得到了正确的回应:

"generatedNumber":28

但是当我尝试使用 aws-api-gateway-client 访问 node.js 中的 API 时,我收到以下响应:

_currentUrl: 'https://abcdefgh.execute-api.ap-south-1.amazonaws.com/DEV/number' ,
  response: undefined

当前 url 应设置为“https://abcdefgh.execute-api.ap-south-1.amazonaws.com/DEV/number?min=20&max=40”,但设置为“https://abcdefgh.execute-api.ap-south-1.amazonaws.com/DEV/number”。

这是我访问此 api 的 node.js 代码:

let AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');
//AWS.config.region = 'ap-south-1';
let lambda = new AWS.Lambda();
let apigClientFactory = require('aws-api-gateway-client').default;
let config = 
    invokeUrl: 'https://abcdefgh.execute-api.ap-south-1.amazonaws.com/DEV',
    accessKey: '<access-key>',
    secretKey: '<secret-key>',
    region: 'ap-south-1'
;
let apigClient = apigClientFactory.newClient(config);
let apiParams = '"min": 20,"max": 40';
let body = 
    


let additionalParams = 
   

apigClient.invokeApi(apiParams, '/number', 'GET', additionalParams, body)
    .then(function (result) 
        console.log(result);
    )
    .catch(function (error) 
        console.log(error);
    );

我尝试将 apiParams 更改为:

let apiParams = "min": 20,"max": 40;

我收到以下错误: '"message": "Could not parse request body into json: Unexpected character (\\\',\\\' (code 44)): expected a value\\n at [Source: [B@42feb146; line: 2, column: 14]"' 我的代码有什么问题?

提前致谢

【问题讨论】:

您是否启用了 CORS 配置?如果是,那么您是否设置了端点(意味着部署的 API)?也许你应该尝试body : JSON.stringify(data) 来回复。同时设置Content-Type : application/json。在 POST 方法中检查集成具有 lambda 作为集成类型。同时启用 lambda 代理集成。 CORS 已启用:是的。已部署 API:是的。我应该在集成响应中添加 body : JSON.stringify(data) 还是应该在 then 函数中使用 JSON.stringify(result) 。我没有 POST 方法。我启用了 lambda 代理集成。但现在我通过节点 js 和直接访问链接获取内部服务器错误。 内部服务器错误主要是由于 lambda 函数的响应。检查 Cloudwatch 日志。是的,如果那是 GET 请求,那么应该使用 JSON.parse(data)。但如果有 POST 方法,则只能使用 stringify 方法。我目前没有我的个人aws帐户,我使用公司的帐户。所以我不能帮你直接帮助老兄! 谢谢。我会查看 Cloudwatch 日志 【参考方案1】:

尝试修改映射模板:


    "min" : "$input.params('min')",
    "max" : "$input.params('max')"

来源:input-variable-reference

【讨论】:

嗨 @Parashar 现在我正在获取对象 generatedNumber :null 。 我在 lambda 函数中删除了一个 console.log(event)。在 cloudwatch 日志中,我得到 min: '', max: '' 【参考方案2】:

我发现了问题。我需要在 AdditionalParmae​​ters 对象中传递参数,例如:

let additionalParams = 
   queryParams: 
   min: 20, max: 40
   

但是文字

var params = 
    //This is where any header, path, or querystring request params go. The key is the parameter named as defined in the API
    userId: '1234',
;

具有误导性,因为在将参数添加到 params 对象时未传递查询参数(可能是对我而言),但仅在在 AdditionalPrams 中传递时才传递。

希望对你有帮助。

【讨论】:

以上是关于响应未定义 - aws-api-gateway-client的主要内容,如果未能解决你的问题,请参考以下文章

自定义 laravel sanctum 未授权响应

Ipstack 响应是“未定义的”,文档没有解释为啥?

GraphQL 响应错误“未定义 URLSearchParams”

为啥我总是在这个 ajax 帖子到 php 时得到未定义的响应?

POST 请求响应未定义,但 REQUEST 有效

节点 express 引用错误响应未定义