请确定如何创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