Node.js fs.createReadStream和.pipe()
我正试图使用Node.js中请求包的Node.js fs.createReadStream和.pipe(),node.js,httprequest,Node.js,Httprequest,我正试图使用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 我
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'
它没有出错,但现在似乎也没有任何作用。程序刚刚执行,我从来没有看到console.log()
更新#2:
使用帮助手册,您可以执行以下操作:
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-需要长度
如果没有定义的内容长度(length),则无法处理他的请求
必需)
选项var需要是一个流。你必须这样做:
readStream.pipe(request(options))
您正在通过管道连接到一个对象,这就是为什么您在上没有更新的方法#2:
请求github说
请求也可以通过管道传输到自身。执行此操作时,内容类型和内容长度将保留在PUT标头中
我不需要设置标题,但是如果Apache Tomcat抱怨,您可以始终按如下方式设置内容长度:
var stats = fs.statSync('file.json');
var stats=fs.statSync('file.json');
然后在选项标题中:
Content-Length':stats.size
内容长度“:stats.size
您的结束事件未被激发。可能您的请求工作不正常,这意味着readStream永远不会到达终点。这是从读取文件流获取
end
事件的一种尝试,如下所示:readStream.on('end',function(){console.log('end!'));readStream.pipe(process.stdout);如果这样做有效,那么您的请求可能有问题。嘿,我认为问题在于它需要是request.post(),所以我实际上发布了一些东西,但我仍然得到上面列出的长度错误。谢谢你坚持这一点,我们很接近!我现在正在尝试这种表单数据方法:
Content-Length':stats.size