Request: 最初の引数はバッファの文字列である必要があります

作成日 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)

面白いことに、リクエストモジュールの現在のバージョンを古いバージョン(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: {}を使用しないでください。 本文でデータを渡したい場合は、代わりにjson: {}使用してください

全てのコメント25件

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 bodyStringまたは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を本体としてエラーなしで使用していましたが、配列の長さがゼロのリクエストを送信すると、突然エラーがスローされました。 おそらく、何らかの方法で、検証のバグが少しあります。

このページは役に立ちましたか?
0 / 5 - 0 評価