为什么pipe道不能在callback中工作?

我有以下服务器:

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

然后,我使用请求将stream传输到服务器。

 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(…)移到mkdircallback之外时,它每次都有效。 有谁能解释为什么会发生?

由于mkdir是asynchronous的,请求中的数据是在创build目录时发出的。 您需要指示stream不发送数据,直到稍后使用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);