Flatiron Union“之后”功能在“之前”功能之前执行?

时间:2012-04-27 16:16:30

标签: flatiron.js

我正在开发一个基于Flatiron Union的应用程序,似乎我在路由运行之前开发日志的简单记录器,因此它无法准确报告发生的情况。我从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

请注意,当http服务器实际返回404时,报告的状态为200。

为什么这不合规?

1 个答案:

答案 0 :(得分:1)

以下是indexzero在我们的邮件列表中对您的问题的最近回复:

  

司徒,

     

这实际上是预期的行为。管道由a构成   union.RoutingStream实例来自:

     

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

     

因此调用后链中每个Stream上的pipe事件   马上,但这些Streams的每个人都有机会   通过实现自己的.pipe()修改发送到响应的数据   方法。

     

例如,如果你的LoggingStream是

     

var stream = new union.ResponseStream(); stream.once( “数据”,   function(req){console.log({res:this.res.statusCode,method:   this.req.method}); });返回流;

     

您会看到console.log语句按您期望的顺序触发。   阅读Max Ogden最近关于Streams的博客文章可能会有所帮助   node.js及其工作原理:http://maxogden.com/node-streams

     

干杯,查理

如果您有更多问题,可以在github,irc(freenode上的#nodejitsu)和我们的邮件列表flatironjs@googlegroups.com上找到我们。 :)