0

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であることに注意してください。

なぜこれが故障しているのですか?

4

1 に答える 1

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 stream = new union.ResponseStream(); stream.once( "data"、function(req){console.log({res:this.res.statusCode、method:this.req.method});}); リターンストリーム;

console.logステートメントが期待どおりの順序で起動するのがわかります。node.jsのストリームに関するMaxOgdenの最近のブログ投稿とその仕組みを読むと役立つ場合があります:http://maxogden.com/node-streams

乾杯、チャーリー

さらに質問がある場合は、github、irc(freenodeでは#nodejitsu)、およびflatironjs@googlegroups.comのメーリングリストで私たちを見つけることができます。:)

于 2012-05-01T04:13:00.323 に答える