2012-07-08 51 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

相關問題