Request: 第一个参数必须是一串 Buffer

创建于 2015-11-16  ·  25评论  ·  资料来源: request/request

嗨,我正在运行一些代码并收到此错误消息:

_http_outgoing.js:441
    throw new TypeError('first argument must be a string or Buffer');
    ^

TypeError: first argument must be a string or Buffer
    at ClientRequest.OutgoingMessage.write (_http_outgoing.js:441:11)
    at Request.write (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:1392:25)
    at end (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:550:16)
    at Immediate._onImmediate (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:578:7)
    at processImmediate [as _immediateCallback] (timers.js:383:17)

有趣的是,如果我用旧版本(### v2.60.0 (2015/07/21),根据更新日志)替换当前版本的请求模块,一切正常。

导致这个错误的代码是这样的:

  request.post({
        url: '<someURL>',
        qs: {
          'client': 'Google+Chrome',
          'client_id': config.clientId
        },
        headers: {
          'Content-Type': 'application/octet-stream',
          'Authorization': 'Bearer '+ accessToken
        },
        encoding: null, //  if you expect binary data
        responseType: 'buffer', 
        body: body
    }, (error, response, body) => {..blah...});

最有用的评论

基本上不要在您的请求中使用body: {} 。 如果要在正文中传递数据,请改用json: {}

所有25条评论

body是什么数据类型? 也没有responseType属性。

是这样的: body = new Uint8Array(request.toArrayBuffer())
我知道没有 resopnseType,但这应该无关紧要(因为它有效),对吧?

所以,基本上身体应该是StringBuffer ,不确定这些新类型。

嗯,一直工作到现在,所以这意味着发送这个新的内置类型没有问题(无论它是什么以及它与 Buffer 的关系是什么),
只是人为添加了一些 if 条件,从而引发了不必要的错误。

我发现了一些我可以使用的修补程序,我只是觉得有些不必要:
https://www.npmjs.com/package/uint8

错误是从核心抛出的,而不是从这个模块抛出的。 这很可能与平台升级有关 - 如果您升级了 NodeJS 版本。 您是否在浏览器中使用请求? 如果条件呢? 什么工作到现在?

不,当我在节点上运行它时会发生此错误。 直到我升级 npm(昨天)才发生。
然后当我用旧的覆盖 node_modules/request 时,它又开始工作了。
然后很奇怪,错误是从节点核心本身抛出的。

真是奇怪的ID。 我在过去的 PR 中发现了两个可能的嫌疑人,但我需要您的 _exact_ 代码来重现该错误 - 我可以运行的一个小型自包含代码示例。

这段代码怎么样?

var request = require('request');
request.post({
        url: 'https://clients4.google.com/chrome-sync/command',
        qs: {
          'client': 'Google+Chrome',
           'client_id': '12345'
        },
        headers: {
          'Content-Type': 'application/octet-stream',
          'Authorization': 'Bearer 123'
        },
        encoding: null, //  if you expect binary data
        responseType: 'buffer',
        body: new Uint8Array(3)
      }, function(e,r,b){console.log(e,r,b)});

固定在这里#1905

超级,谢谢! :)

大家好,

我安装了 2.70.0 版,但我仍然在为同样的错误而苦苦挣扎:

TypeError: first argument must be a string or Buffer
    at ServerResponse.OutgoingMessage.end (_http_outgoing.js:524:11)
    at /Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/routes/index.js:87:17
    at Request._callback (/Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/routes/proxy.js:81:7)
    at Request.self.callback (/Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/node_modules/request/request.js:200:22)

这是我目前使用的代码:

var options = {
      url: url,
      path: req.path,
      qs: req.query,
      method: req.method,
      headers: headers,
      responseType: 'buffer',
      timeout: TIMEOUT
    };

 options.json = true;
 options.body = {
        "firstName": "Test1",
        "lastName": "Test2",
        "email": "[email protected]",
        "mobilePhone": "+38631288288"
 };

 request(options, function (error, response, body) {
      callback(error, response, body, options);
    });

我希望我的代码和问题足够清楚。

也有这个错误。

@novellizator你能重新打开这个吗?

@banomaster @Ohar body必须是StringBuffer

@simov哦,谢谢。
我用了

res.write(data);
res.end();

它返回 JSON,但我在远程服务器上遇到了这个问题 (#1904)。
使用res.json()修复问题,bcz 转义 JSON 并将其字符串化。 但是我需要得到 JSON 作为响应,当我使用res.json ,它会向我发送一个转义字符串。
你能帮我解决这个问题吗?

例子

处理程序

function foo (req, res) {
  request.post(
    'https://example.com/api',
    {form: data},
    function (error, response, body) {
      res.json(body);
    }
  );
}

实际反应

"{\"response\":{\"data\":{}},\"status\":0}"

期望的回应

{
    "response": {
        "data": {}
    },
    "status": 0
}

json选项设置为true ,还可以查看文档中的选项部分。
您的最后一个问题与此问题无关,如果您有其他问题,请发布一个新问题。

哇,勇敢的请求团队,在不升级主要版本的情况下打破界面的方法:/

@mboudreau你能打开另一个问题并准确解释什么对你不起作用吗?

本质上,我从 2.64.x 开始就一直在使用 request,而且我一直只是
在主体中使用了一个根据请求自动序列化的对象,
但自从最新版本以来,情况不再如此。 这本质上
新版本发布时同时破坏了我的几个版本
带有非常神秘的错误消息。

我生气的原因是因为语义版本控制标准说
当引入重大更改时,主要版本需要
被递增。 正如您从该线程中看到的,最新的功能版本
打破了很多,个人给我造成了很多挫折和浪费
时间试图计算或这个错误。

我认为它不值得拥有自己的票,但只是警告
更改并确保正确遵循语义版本控制。

在星期五,2016年4月29日,17:28 SIMO [email protected]写道:

@mboudreau https://github.com/mboudreau你能打开另一个问题吗
并准确解释什么对您不起作用?


你收到这个是因为你被提到了。
直接回复此邮件或在 GitHub 上查看
https://github.com/request/request/issues/1904#issuecomment -215646824

我仍然不确定您的情况的预期行为是什么? 您是否希望将对象传递给body选项并发送字符串化的 JSON 或查询字符串主体?

无论哪种方式,您都应该提供一个代码示例来重现该错误。 从文档:

body - PATCH、POST 和 PUT 请求的实体主体。 必须是 Buffer、String 或 ReadStream。 如果 json 为 true,则 body 必须是 JSON 可序列化对象。

你可以测试这个:

request({
  method: 'POST',
  url: 'http://requestb.in/tr4jaxtr',
  body: {a: 1},
  json: true,
  callback: (err, res, body) => {
    if (err) {
      console.log(err)
    }
    console.log(body)
  }
})

此处查看结果。 如您所见,主体是一个字符串化的 JSON 对象。

大家好,我一直在摆弄这个错误一段时间,这是我发现的。 当 post 请求参数的类型为: {form: {key: 1}}它会自动序列化 post 参数,但是当它是其他类型时,比如{body: {key: 1}}它会抛出new TypeError('first argument must be a string or Buffer');错误。

为了克服这个问题,我只是做了{body: JSON.stringify({key: 1})}并且请求成功了。 我还没有查看来源,但这对我有用。

此外,如果我们在选项对象中设置json: true ,它会自动序列化请求参数。

基本上不要在您的请求中使用body: {} 。 如果要在正文中传递数据,请改用json: {}

有时最好的答案是线程的最底层。 谢谢@itsyogesh @cozzbie

@novellizator伙计们,这是一个封闭的问题,但我很困惑,因为我正在为二进制图像执行此操作并得到相同的错误:

app.post(self._options.baseUrl + '/image.post', function (req, res) {

                delete req.headers.host;

                var headers= req.headers;
                headers['Content-Type'] = 'application/octet-stream';

                request.post('http://localhost:9080/image.post',
                    {
                        headers: headers,
                        encoding: null, //  if you expect binary data
                        responseType: 'buffer',
                        body: req.body
                    },
                    function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            res.send(body);
                            res.end();
                        } else {
                            res.send({ error: new Error('image error') });
                            res.end();
                        }
                    })
            })

嘿,刚刚遇到了一个解决方案。 我正在发送一个 json body ,但我需要将它转换为带有body: JSON.stringify(body)字符串

我使用Uint8Array作为我的主体没有错误,但是当我发送一个数组长度为零的请求时,它突然抛出了一个错误。 可能有点验证错误,以一种或另一种方式。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

danielgindi picture danielgindi  ·  20评论

Fov6363 picture Fov6363  ·  24评论

dcsan picture dcsan  ·  19评论

raeesaa picture raeesaa  ·  29评论

nijikokun picture nijikokun  ·  61评论