嗨,我正在运行一些代码并收到此错误消息:
_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
是什么数据类型? 也没有responseType
属性。
是这样的: body = new Uint8Array(request.toArrayBuffer())
我知道没有 resopnseType,但这应该无关紧要(因为它有效),对吧?
所以,基本上身体应该是String
或Buffer
,不确定这些新类型。
嗯,一直工作到现在,所以这意味着发送这个新的内置类型没有问题(无论它是什么以及它与 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
必须是String
或Buffer
@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
作为我的主体没有错误,但是当我发送一个数组长度为零的请求时,它突然抛出了一个错误。 可能有点验证错误,以一种或另一种方式。
最有用的评论
基本上不要在您的请求中使用
body: {}
。 如果要在正文中传递数据,请改用json: {}