我正在尝试使用Node.js中的request.post()
请求包将一个大文件发布到另一台服务器上,我得到了:
(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
RangeError: Maximum call stack size exceeded
我认为这是因为它是一个大文件(80MB)因为较小的文件工作正常,所以我现在正在尝试实现一个流:
var options = {
url: aURLIHaveDefined,
headers: {
'User-Agent': 'MyRestAPI'
},
auth: {
username: creds.username,
password: creds.password
},
strictSSL: false,
json: true
}
var readStream = fs.createReadStream(filePathIHaveDefined);
readStream.pipe(options);
我收到错误:
TypeError: Object #<Object> has no method 'on'
有没有人知道在管道中包含选项的语法以及为什么我收到此错误?
更新(在sousa评论之后): 我试过了:
readStream.pipe(request(options));
readStream.on('end', function() {
console.log('end of readStream'+fileName);
});
它没有错误,但现在似乎也没有做任何事情。该程序刚刚执行,我从未见过console.log()
?
更新#2:
使用帮助手册here,发现您可以执行此操作:
fs.createReadStream('file.json').pipe(request.put('http://....'))
所以我在管道里面添加了request.post()
,好像我差不多了!使用:
readStream.pipe(
request.post(options,
function(error, response, data) {
if (error) {
console.log(": Cannot upload file to " + creds.server + " due to " + error);
setImmediate(failureCallback(error));
} else {
console.log(": file uploaded to " + data);
// send back data, which is url of uploaded file
setImmediate( successCallback(data) );
}
}
)
);
我得到一个错误,说明需要知道长度:
Apache Tomcat / 5.5.17 - 错误报告HTTP状态411 - 需要长度 如果没有定义的内容长度(长度,则无法处理) 必需的)。
答案 0 :(得分:5)
选项var必须是一个流。你必须做这样的事情:
readStream.pipe(request(options))
你正在管道对象,这就是你没有方法on
的原因。
答案 1 :(得分:0)
更新#2: 请求github说 &#34;请求也可以自行管道。这样做时,内容类型和内容长度将保留在PUT标题中,并且#34;
我不需要设置标头,但是如果Apache Tomcat抱怨你总是可以按如下方式设置Content-Length:
var stats = fs.statSync('file.json');
然后在选项标题中:
Content-Length':stats.size