请确定如何创buildfilter来捕获请求和响应并进行logging

在我的restify服务器中,我有一个要添加filter的路由。 在Express中工作的方式(这在Express中工作)是response.on将我的处理程序添加为callback。 然后,在响应返回给请求者之前,我的处理程序将被调用。 这不是我在Restify中看到的行为。 我的猜测是我没有正确地注册我的处理程序的事件机器。

 restifyServer.get({ path: "/api/v1/readings", version: ["1.0.0"]}, Reading.getReadings); 

我添加一个处理程序:

 function zipkinTracing(request, response, next){ // handle the callback request and record the trace var trace = zipkin.getTraceFromRequest(request, "ids-api", {address: config.externalIP, port: 80}); if (trace){ zipkin.sendAnnotationReceive(trace); zipkin.sendAnnotation(trace, 'request.headers',JSON.stringify(request.headers)); trace.parentSpanId = trace.spanId; zipkin.sendAnnotation(trace, 'http.uri', request.url); var queryObj = urlLib.parse(request.url, true).query; Object.keys(queryObj).forEach( function(key){ zipkin.sendAnnotation(trace, key, queryObj[key]); }); request.zipkinTrace = trace; } response.on('after', function(request, response, route, error){ var t = request.zipkinTrace; if (t) { zipkin.sendAnnotation(t, 'http.response.code',response.code); zipkin.sendAnnotationSend(t); } }); return next(); } 

现在我的路线如下所示:

 restifyServer.use(zipkinTracing); restifyServer.get({ path: "/api/v1/readings", version: ["1.0.0"]}, Reading.getReadings); 

问题是response.on('after',从来没有被解雇,我在这里做错了什么?

Reading.getReadings看起来像这样:

 makeHttpQuery(request, response, function(error, message) { .... response.send(message['data']['data']); return next(); } 

我能解决这个问题。 为了创build一个真正的filter,我将处理函数注册到response.on('finish', handler)就像在Express中一样。 替代解决scheme将是放置

 restifyServer.on('after', function(request, response){ var t = request.zipkinTrace; if (t) { zipkin.sendAnnotation(t, 'http.response.code',response.code); zipkin.sendAnnotationSend(t); } }); 

过滤后的路线。 我更喜欢response.on('finish', handler) 。 任何其他解决scheme或有趣的方式来创build一个请求和响应的filter?

您还可以向请求添加多个处理程序。 一个处理程序将完成并传递下一个处理程序,就像filter一样。

请参阅: http : //restify.com/#routing