为什么管道不在回调中工作

时间:2012-07-08 19:49:51

标签: node.js stream

我有以下服务器:

http.createServer(function (req, res) {

  fs.mkdir(__dirname + '/output', function (err) {

    req.pipe(fs.createWriteStream(__dirname + '/output/file.txt'));
    res.end();

  });

}).listen(3000);

然后我使用request将流传输到服务器。

var fs = require('fs');
var request = require('request');

var crs = fs.createReadStream(__dirname + '/file.txt');
var r = request.post('http://0.0.0.0:3000');

crs.pipe(r);

有时它可以工作,但大部分时间/output/file.txt都是空的。当我将req.pipe(...)移到mkdir回调之外时,它每次都有效。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

由于mkdir是异步的,因此在创建目录时会发出请求中的数据。您需要指示流在以后使用pauseresume不会发出数据。

http.createServer(function (req, res) {
  req.pause();
  fs.mkdir(__dirname + '/output', function (err) {
    req.pipe(fs.createWriteStream(__dirname + '/output/file.txt'));

    req.resume();
    res.end();
  });
}).listen(3000);