Node.js Lambda请求函数获取411长度要求

马蒂萨

我使用一个node.js lambda发出对远程api的发布请求,该api安装在多个远程位置。
我无权访问远程api代码或日志。
Lambda由我也不控制的外部应用程序通过HTTP网关调用。

它适用于除一个以外的所有位置。对于一个位置,我得到此错误:

411所需长度。

我试图中和HTTP网关,并运行带有测试事件的lambda帖子。
我得到相同的结果。

我已将相同的确切请求发送到其他位置,并得到了答复。发送ContentLength标题后,我找不到问题

这是lambda代码:

const https = require("https");
const iconv =  require("iconv-lite");
const charset  =  require("charset");
const qs  =  require("qs");
const url  =  require("url");

exports.handler = (event, context, callback) => {
  event = JSON.parse(JSON.stringify(event));

    let enc ="";
    let multiValueHeaders = event["multiValueHeaders"]["Content-Type"];
    let PostParams = null;
    let domain = event["queryStringParameters"]["domain"] ;

    let buf = Buffer.from(JSON.stringify(event["body"]), "base64"); 
    let tstring =   buf.toString("utf8");
    PostParams  = qs.parse(tstring);
     
    var postData = PostParams ?  qs.stringify(PostParams) : {};
    
    let ContentLength = new Buffer.from(postData).length;
    let headers = "" ;
    headers += (multiValueHeaders) ? (' { "Content-Type": "'+ multiValueHeaders + '",') : '{';
    headers += ('"Content-Length":'+ ContentLength + '}');
    headers = JSON.parse(headers);
   
    var q = url.parse(domain, true);
    let options = {
      'method': 'POST',
      'hostname': q.hostname,
      'path': q.pathname,
      'headers':  {headers}
    };
    
      var req = http.request(options, function (res) {
      let chunks = [];
    
      res.on("data", function (chunk) {
        chunks.push(chunk);
        enc = charset(res.headers, chunk);
      });
    
      res.on("end", function (chunk) {
          var decodedBody = iconv.decode(Buffer.concat(chunks), enc);
   
          const response = {
              statusCode: 200,
              body: decodedBody
          };
          callback(null ,response );
      });
    
      res.on("error", function (error) {
        console.error(error);
      });
    }); 
  
    
    if (PostParams != null) req.write(postData);
    req.end();  
     
  
}

将请求直接发送到端点邮递员时,没有错误。仅来自lambda。

丹尼尔·里奇(Daniele Ricci)

除了为什么event = JSON.parse(JSON.stringify(event));呢?

除此之外,这是构建headers对象的非常难看的方法

let headers = "";
headers += (multiValueHeaders) ? (' { "Content-Type": "'+ multiValueHeaders + '",') : '{';
headers += ('"Content-Length":'+ ContentLength + '}');
headers = JSON.parse(headers);

而我会这样写:

const headers = { "Content-Length": ContentLength };
if(multiValueHeaders) headers["Content-Type"] = multiValueHeaders;

您的问题的根本原因在于此行:

'headers':  {headers}

需要在以下位置进行更改:

'headers': headers

希望这可以帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

NODE JS取消请求

来自分类Dev

Node js,函数执行

来自分类Dev

迭代node.js请求函数

来自分类Dev

Node.js 请求函数返回数据

来自分类Dev

Node.js:从请求获取路径

来自分类Dev

如何获取Node.js请求类型?

来自分类Dev

Node.js https获取请求ECONNRESET

来自分类Dev

使用Node.Js的Lambda函数

来自分类Dev

获取Node.js函数定义

来自分类Dev

获取Node.js函数定义

来自分类Dev

Node.js GET请求

来自分类Dev

Node.JS readFileSync()函数

来自分类Dev

Node.js-不是函数

来自分类Dev

Node.js-不是函数

来自分类Dev

Node js foreach done 函数

来自分类Dev

node js mongodb 获取数据

来自分类常见问题

如何从Node.js http获取请求中获取数据

来自分类Dev

如何使用Node.js中的Lambda函数从Amazon RDS获取数据?

来自分类Dev

在 Node js 中 Rest Api 请求(curl 到 Node.js,python 到 Node.js)

来自分类Dev

如何使用Node.js AWS Lambda发送HTTP请求?

来自分类Dev

如何在Node.js Lambda中使用请求模块

来自分类Dev

node.js请求处理程序不会调用函数

来自分类Dev

Node.JS HTTP 请求 - 分离回调函数

来自分类Dev

Node.js 请求函数给 url 添加斜杠

来自分类Dev

如何在Express Node JS中获取删除请求的参数

来自分类Dev

从Node.js中的请求路由获取其余路径

来自分类Dev

如何使用node.js处理获取请求(快速)

来自分类Dev

使用Node.js执行同步获取请求

来自分类Dev

如何从node.js中的请求模块获取cookie?