我正在尝试使用request
模块从节点服务器到另一台服务器进行HTTP POST
。
我的代码看起来像,
var req = request.post({url: "http://foo.com/bar", headers: myHeaders});
...
...
req.write("Hello");
...
...
req.end("World");
我希望请求的正文在接收端为"Hello World"
,但我最终只是""
。
我在这里缺少什么?
注意:代码中的省略号表示可能会在不同的流程标记中执行write
和end
。
答案 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'));
更新
stream.bytesWritten
,其中var stream = fs.createWriteStream('file')
正如您在上面的代码段中看到的那样。我想你无法知道管道的另一端有多少,但是bitesWritten应该给你一个相当不错的近似值。 data
和end
stream
和request.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}}。