1

ノードサーバーから別のサーバーへHTTP POSTのモジュールを使用しようとしています。request

私のコードは次のようになります。

var req = request.post({url: "http://foo.com/bar", headers: myHeaders});
...
...
req.write("Hello");
...
...
req.end("World");

"Hello World"リクエストの本文が受信側にあることを期待していますが、最終的には"".

ここで何が欠けていますか?

注: コード内の省略記号は、 と が異なるプロセス ticks で実行される可能性があることを示しwriteendます。

4

3 に答える 3

0

3onが指摘したように、POSTリクエストの正しい構文は次のとおりです。

request({ method:"post", url: "server.com", body:"Hello World"}, callback);

便利な方法もあります。

request.post({ url: "server.com", body:"Hello World"}, callback);

しかし、あなたの質問から、あなたはストリーミングしたいようです:

var request = require('request');
var fs = require('fs');

var stream = fs.createWriteStream('file');

stream.write('Hello');
stream.write('World');

fs.createReadStream('file').pipe(request.post('http://server.com'));

アップデート:

  • RAMがあれば、ストリームに書き込んだチャンクを好きなように分割できます(4mbはピーナッツですが、v8(ノードの背後にあるjavascriptエンジン)には1.4GBの割り当て制限があることに注意してください) ;
  • 上記のコードの一部に見られるように、パイプstream.bytesWrittenにどれだけ「書き込んだ」かがわかります。var stream = fs.createWriteStream('file')ただし、パイプのもう一方の端がどれだけ得られたかはわかりませんが、bitesWrittenを使用するとかなり適切な近似値が得られるはずです。
  • dataとの両方のendイベントを聞くことができますstreamrequest.post('http://server.com')
于 2012-08-22T04:42:10.247 に答える
0

ここで質問に書かれたコードを有効にし、requestモジュールを少し変更することで期待どおりに動作させることができました。

関数内requestのコード ブロックに気付きました( 356 行目)。main.jsRequest.prototype.init

process.nextTick(function () {
    if (self._aborted) return

    if (self.body) {
      if (Array.isArray(self.body)) {
        self.body.forEach(function (part) {
          self.write(part)
        })
      } else {
        self.write(self.body)
      }
      self.end()
    } else if (self.requestBodyStream) {
      console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.")
      self.requestBodyStream.pipe(self)
    } else if (!self.src) {
      if (self.method !== 'GET' && typeof self.method !== 'undefined') {
        self.headers['content-length'] = 0;
      }
      self.end();
    }
    self.ntick = true
  })

endOnTickリクエストの作成中に新しいオプション ( ) を追加して、この関数呼び出しをオーバーライドしています。私の変更点: mikeal/masterGotEmB /master の比較

于 2012-08-22T15:01:22.297 に答える
0

Request http.clientRequest/http.serverRequest を見逃しているように見えます

リクエストでサーバーに投稿したい場合、やりたいことは次のようなものです

request({ method:"post", url: "server.com", body:"Hello World"}, callback);
于 2012-08-21T22:26:41.903 に答える