こんにちは、私はいくつかのコードを実行していて、このエラーメッセージを受け取りました:
_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)
面白いことに、リクエストモジュールの現在のバージョンを古いバージョン(changelogによると### 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を古いもので上書きすると、再び機能し始めました。
次に、エラーがノードコア自体からスローされるのは非常に奇妙です。
それは奇妙なiddです。 過去のPRで2つの容疑者を見つけましたが、バグを再現するには_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からリクエストを使用しており、常に
リクエストにより自動的にシリアル化された本体のオブジェクトを使用し、
しかし、最新バージョン以降、これはもはや当てはまりません。 これは本質的に
新しいバージョンがリリースされたときに同時にいくつかのビルドを壊しました
非常に不可解なエラーメッセージが表示されます。
私がイライラする理由は、セマンティックバージョニング標準が言っているからです
重大な変更が導入されている場合、メジャーバージョンは次のことを行う必要があります。
インクリメントされます。 このスレッドからわかるように、最新の機能バージョン
多くの人のために壊れて、個人的に私に多くの欲求不満と無駄を引き起こしました
計算しようとする時間またはこのエラー。
私はそれがそれ自身のチケットに値するとは思わないが、ただの警告
変更し、セマンティックバージョニングに正しく従うようにします。
金、2016年4月29日には、17:28 SIMO [email protected]は書きました:
@mboudreauhttps ://github.com/mboudreau別の問題を開くことができますか
何がうまくいかないのかを正確に説明してください。—
あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHubで表示してください
https://github.com/request/request/issues/1904#issuecomment -215646824
あなたの場合に予想される動作はまだわかりませんか? オブジェクトをbody
オプションに渡し、文字列化されたJSONまたはクエリ文字列の本文を送信することを期待していますか?
いずれにせよ、バグを再現するためのコード例を提供する必要があります。 ドキュメントから:
body
-PATCH、POST、およびPUTリクエストのエンティティ本体。 バッファ、文字列、または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)
}
})
ここで結果を参照して
みなさん、こんにちは。私はしばらくの間このエラーをいじっていました。これが私が見つけたものです。 postリクエストパラメータのタイプが{form: {key: 1}}
場合、postパラメータは自動的にシリアル化されますが、それ以外の場合、たとえば{body: {key: 1}}
場合、 new TypeError('first argument must be a string or Buffer');
エラーがスローされます。
これを克服するために、私は{body: JSON.stringify({key: 1})}
を実行しただけで、リクエストは成功しました。 私はまだソースを調べていませんが、これは私にとってはうまくいきました。
また、optionsオブジェクトに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: {}
使用してください