fs.createReadStream和.pipe()

时间:2014-02-21 13:23:40

标签: 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

我认为这是因为它是一个大文件(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 - 需要长度   如果没有定义的内容长度(长度,则无法处理)   必需的)。

2 个答案:

答案 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