Привет, я запускал код и получил это сообщение об ошибке:
_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
, не уверен в этих новых типах.
Что ж, in работал до сих пор, так что это означает, что не было проблем _ per se_ с отправкой этого нового встроенного типа (что бы это ни было и какое бы отношение оно ни было к Buffer),
было искусственно добавлено только какое-то условие if, которое вызывает ненужную ошибку.
Я нашел несколько исправлений, которые мог бы использовать, но считаю это несколько ненужным:
https://www.npmjs.com/package/uint8
Ошибка возникает из ядра, а не из этого модуля. Скорее всего, это связано с обновлением платформы - если вы обновили свою версию NodeJS. Вы используете запрос в браузере? Что, если состояние? Что работало до сих пор?
Нет, эта ошибка возникает, когда я запускаю ее на узле. Этого не произошло, пока я не обновил npm (вчера).
А потом, когда я перезаписал node_modules / request старым, он снова заработал.
Тогда довольно странно, что ошибка возникает из самого ядра узла.
Это странный idd. Я нашел двух возможных подозреваемых в прошлых 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()
fix, 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, и всегда просто
использовал объект в теле, который был автоматически сериализован по запросу,
но начиная с последней версии, это уже не так. Это по сути
сломал несколько моих сборок одновременно с выходом новой версии
с очень загадочным сообщением об ошибке.
Причина, по которой меня раздражает, заключается в том, что стандарт семантического управления версиями говорит
что когда вводится критическое изменение, основная версия должна быть
увеличиваться. Как видно из этой ветки, последняя версия функции
сломался для многих и лично вызвал у меня много разочарования и потрачен впустую
время пытается понять или эта ошибка.
Я не думаю, что он заслуживает собственного билета, это просто предупреждение
изменения и убедиться, что семантическое управление версиями выполняется правильно.
Пт, 29 апреля 2016 г., 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, тогда тело должно быть сериализуемым объектом 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.
Привет всем, я какое-то время возился с этой ошибкой, и вот что я узнал. Когда параметры почтового запроса имеют тип: {form: {key: 1}}
он автоматически сериализует параметры сообщения, но когда это что-то другое, скажем, {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: {}