我正在开发一个基于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。
为什么这不合规?
答案 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上找到我们。 :)