解决如何创建过滤器以捕获请求和响应以及记录的问题

时间:2014-02-28 16:56:59

标签: node.js filter interceptor restify

在我的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();
}

2 个答案:

答案 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)

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

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