使用基于快速请求的变量进行记录(相关ID)

时间:2018-08-22 09:48:58

标签: javascript node.js express logging bunyan

我们正在将关联ID添加到我们的节点快递应用中,以将请求绑定在一起。该ID在其他服务的标头中发送,我们的中间件收集ID,使用ID创建一个Bunyan记录器,并将其添加到请求对象中。

我们的路线目前如下所示:

 router.get('', (req, res, next) => {
    service.doSomething(req.params.userid)
      .then(items => res.json(items))
      .catch((err) => next(err));
  });

当前建议的解决方案如下:

 router.get('', (req, res, next) => {
    let logger = req.log;
    service.doSomething(req.params.userid, logger)
      .then(items => res.json(items))
      .catch((err) => next(err));
  });

这意味着doSomething及其调用的每个函数都需要接受日志记录对象作为参数。这意味着几乎每个函数都需要接受一个日志记录对象。

例如:

function add(a, b, log) {
  log.debug("Trivial example");
  return a + b;
}

是否有更好的方法可以针对每个请求进行记录,而无需将记录对象传递给每个函数?

1 个答案:

答案 0 :(得分:0)

您可以为此使用快递middleware app.use

在注册端点之前注册中间件并在那里进行日志记录。

var express = require('express');
var app = express();

// register middleware here
app.use(function(req,res,next){


    service
           .doSomething.call(req)
           .then(items => res.json(items))
           .catch((err) => next(err)); 

    next();
});



app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

这样,您可以使用与回调函数本身相同的作用域访问do something方法。然后可以通过req.log访问this.log。然后甚至可以通过req.params.userId

访问this.params.userId

希望有帮助。