Node.js fs.createReadStream和.pipe()

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 我

我正试图使用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'
它没有出错,但现在似乎也没有任何作用。程序刚刚执行,我从来没有看到
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