在我的restify服务器中,我有一个我想要添加过滤器的路由。这在Express中的作用方式(这在Express中有效)是response.on
将我的处理程序添加为回调。然后在将响应返回给请求者之前,将调用我的处理程序。这不是我在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();
}
答案 0 :(得分:2)
我能够解决这个问题。为了创建一个真正的过滤器,我将处理程序函数注册到response.on('finish', handler)
,就像在Express中一样。替代解决方案是放置
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)
。是否有任何其他解决方案或有趣的方法来为请求和响应创建过滤器?
答案 1 :(得分:0)
您还可以为请求添加多个处理程序。一个处理程序将完成并传递下一个处理程序,就像过滤器一样。