1

我正在尝试HTTP POST使用request从节点服务器到另一台服务器的模块。

我的代码看起来像,

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

我希望请求的主体"Hello World"在接收端,但我最终得到的只是"".

我在这里想念什么?

注意:代码中的省略号表示writeend可能在不同的进程记号中执行。

4

3 回答 3

0

在我看来,您好像错过了请求 http.clientRequest/http.serverRequest

如果您想通过请求向服务器发布帖子,您想要做的就是

request({ method:"post", url: "server.com", body:"Hello World"}, callback);
于 2012-08-21T22:26:41.903 回答
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 应该给您一个相当不错的近似值。
  • 您可以同时收听dataendstreamrequest.post('http://server.com')
于 2012-08-22T04:42:10.247 回答
0

request通过稍微修改模块,我设法使此处问题中编写的代码有效并按预期工作。

我注意到函数中request的 'smain.js中有一段代码(在第 356 行),Request.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 回答