4

次のサーバーがあります。

http.createServer(function (req, res) {

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

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

  });

}).listen(3000);

次に、リクエストを使用してストリームをサーバーにパイプします。

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 コールバックの外に移動すると、毎回動作します。なぜそれが起こっているのか誰か説明できますか?

4

1 に答える 1

4

mkdirは非同期であるため、ディレクトリの作成中にリクエスト内のデータが発行されます。pauseと を使用して、後でデータを出力しないようにストリームに指示する必要がありますresume

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);
于 2012-07-08T21:24:08.167 に答える