首页 > 解决方案 > 使用基于快速请求的变量进行日志记录(相关 ID)

问题描述

我们正在向我们的 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));
  });

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

例如:

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

有没有更好的方法可以在每个请求的基础上进行此日志记录,而无需将日志记录对象传递给每个函数?

标签: javascriptnode.jsexpressloggingbunyan

解决方案


您可以为此使用快速中间件 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

希望有帮助。


推荐阅读