使用req.write()和req.end()的POST请求

时间:2012-08-21 22:20:40

标签: node.js

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

我的代码看起来像,

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

我希望请求的正文在接收端为"Hello World",但我最终只是""

我在这里缺少什么?

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

3 个答案:

答案 0 :(得分:0)

它让我觉得你好像错过了请求http.clientRequest / http.serverRequest

如果您想要向服务器发帖,请求您要执行的操作类似于

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

答案 1 :(得分:0)

正如3指出的那样,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应该给你一个相当不错的近似值。
  • 您可以收听dataend
  • streamrequest.post('http://server.com')个事件

答案 2 :(得分:0)

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

我注意到main.js函数Request.prototype.init函数line 356中的request Comparing mikeal/master with GotEmB/master代码块,

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)来覆盖此函数调用。我的更改:{{3}}。