Javascript 使用基于express请求的变量进行日志记录(相关id)

Javascript 使用基于express请求的变量进行日志记录(相关id),javascript,node.js,express,logging,bunyan,Javascript,Node.js,Express,Logging,Bunyan,我们正在向node express应用程序添加相关id,以将请求联系在一起。该id从其他服务发送到报头中,我们的中间件收集该id,使用该id创建一个bunyan记录器,并将其添加到请求对象中 我们目前的路线如下所示: router.get('', (req, res, next) => { service.doSomething(req.params.userid) .then(items => res.json(items)) .catch((er

我们正在向node express应用程序添加相关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));
  });
目前提出的解决方案如下所示:

 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;
}
是否有更好的方法在每个请求的基础上进行此日志记录,而不将日志对象传递给每个函数?

您可以使用express
应用程序。为此,请使用

在注册端点之前注册中间件,并在那里处理日志记录

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方法。然后可以通过
this.log
访问
req.log
。即使是
req.params.userId
也可以通过
this.params.userId


希望有帮助

我认为这有助于记录对服务的请求。不确定如何从服务本身中记录消息。纳泽布更新了我的答案