2

我正在开发一个网络客户端,它使用Node.js 的请求模块请求服务器。发送的请求是 POST 请求。服务器是使用 Express 用 Node.js 编写的。NGINX 的另一层充当代理并将请求重定向到用 Node.js 编写的服务器。

问题是:每当我尝试发送请求时,在没有明确定义任何标头的情况下,NGINX 都会发送内容长度的 html 错误,#411(需要长度)。然而,当我尝试使用浏览器和 curl 发送类似的请求时,一切正常。示例代码如下:

request.post(url, function(err, response, data) {
     if(err) {
         console.log(err);
     } else {
         console.log(data);
     }
}).form({'data':'someValue'})

此外,现在当我将 content-length 添加到请求的标头时,NGINX 挂起,似乎 NGINX 正在等待更多数据到达。NGINX 不会将请求转发到服务器。

添加选项以包括内容长度

var dataObj = {'data' = 'someValue'};

var options = {
    'uri' = url
    , 'headers' = {
        'Content-Length' = JSON.stringify(dataObj).length
    } 
};


    request.post(options, function(err, response, data) {
         if(err) {
             console.log(err);
         } else {
             console.log(data);
         }
    }).form({'data':'someValue'});

我在发送请求时做错了什么?

4

1 回答 1

2

我找到了解决方案。我正在发送 JSON 数据。错误是我正在使用form()函数,它将标题设置为“内容类型:应用程序/x-www-form-urlencoded;charset=utf-8”。引用请求文档

form - 当传递一个对象时,这将设置 body 但为 value 的查询字符串表示并添加 Content-type: application/x-www-form-urlencoded; charset=utf-8 标头。当不传递任何选项时,将返回一个 FormData 实例,该实例将通过管道传递给请求。auth - 包含用户值的哈希 || 用户名、密码 || 通过,并立即发送(可选)。请参阅上面的文档。json - 将 body 设置为 JSON 表示值并添加 Content-type: application/json 标头。此外,将响应正文解析为 json。

一旦我使用了json选项并删除了form()功能,它就开始正常工作。

于 2013-03-04T12:03:13.043 回答