2012-04-27 88 views
0

我正在使用基於Flatiron Union的應用程序,並且似乎我正在開發日誌的簡單記錄器在運行路線之前,因此它不會準確報告發生的情況。我從Union示例中獲取了記錄器示例代碼。這裏是一個精簡的代碼示例:Flatiron Union「之後」功能在「之前」功能之前執行?

var 
    union = require('union') 
    , server; 

server = union.createServer({ 
    before: [ function (req,res) { 
    console.log('before'); 
    res.writeHead(404, {"Content-Type": "text/plain"}); 
    res.end("Hello World"); 
    } ], 
    after: [ 
    function LoggerStream() { 
     var stream = new union.ResponseStream(); 
     stream.once("pipe", function (req) { 
      console.log({res: this.res.statusCode, method: this.req.method}); 
     }); 
     return stream; 
    } 
    ] 
}); 

server.listen(8800); 
console.log('union running on 8800'); 

下面是出現在我的控制檯:

$ DEBUG=* node ./union.js 
union running on 8800 
{ res: 200, method: 'GET' } 
before 

注意,報告的狀態是200,當HTTP服務器實際上返回404

爲什麼這個用完了嗎?

回答

1

這裏是最近的答覆從我們的郵件列表你的問題由indexzero

斯圖爾特,

這實際上是預期的行爲。管道鏈由 union.RoutingStream實例構造而成:

union.ResponseStream() - > after0 - > after1 - > after2 - > ... - > aftern - > http .Response()(見 https://github.com/flatiron/union/blob/master/lib/routing-stream.js#L74-83

所以pipe事件上的每個流中的後鏈馬上調用 ,但這些流中的每個人都有機會 通過實現自己的修改發送到響應數據.pipe() 方法。

因此,舉例來說,如果你的LoggingStream是

VAR流=新union.ResponseStream(); stream.once(「data」, function(req){console.log({res:this.res.statusCode,method: this.req.method});});返回流;

您將看到console.log語句以您期望的順序觸發。 這可能是閱讀最多奧格登對流最近的一篇博客中 node.js中有用的以及它們是如何工作的:http://maxogden.com/node-streams

乾杯,查理

如果您有更多的問題,你可以找到我們在github ,irc(freenode上的#nodejitsu)以及我們的郵件列表[email protected]。 :)

+0

查看對話:https://groups.google.com/forum/?fromgroups#!topic/flatironjs/9EFr2YWx8xY – Zhami 2012-05-02 10:07:44