2012-07-08 55 views
4

我有以下服务器内部配管工作。为什么不回调

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

由于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); 
+0

不幸的是,我的经验是,当你在回调的时候,暂停()该流已经太迟了。我最终在请求流前添加了一个显式缓冲区来缓解这个问题。请参阅https://github.com/Obvious/pipette#valve了解草图。 – danfuzz 2012-07-10 19:20:57

相关问题