【问题标题】:Restify how to create a filter to capture requests and responses and logRestify 如何创建过滤器来捕获请求和响应并记录
【发布时间】:2016-03-05 07:43:36
【问题描述】:

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

【问题讨论】:

    标签: node.js filter interceptor restify


    【解决方案1】:

    我能够解决这个问题。为了创建一个真正的过滤器,我将处理函数注册到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)。任何其他解决方案或有趣的方法来为请求和响应创建过滤器?

    【讨论】:

      【解决方案2】:

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

      见:http://restify.com/#routing

      【讨论】:

        猜你喜欢
        • 2012-07-28
        • 1970-01-01
        • 2017-12-02
        • 2017-02-21
        • 2019-01-10
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        • 2020-05-06
        相关资源
        最近更新 更多