javascript - 使用基于快速请求的变量进行日志记录(相关 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;
}
有没有更好的方法可以在每个请求的基础上进行此日志记录,而无需将日志记录对象传递给每个函数?
解决方案
您可以为此使用快速中间件 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
希望有帮助。
推荐阅读
- python - 使用 python 拟合先知模型时的问题
- r - WikipediaR:如何使用 contribs() 自动化功能?
- json - 如何在 Groovy 中展平和拆分这个 JSON?
- javascript - 如何在 Three.JS 中更改导入模型的位置?
- xamarin - 如何为 xamarin.forms iOS 中的条目单元格设置背景颜色和文本颜色?
- c++ - 是否有理由在标题中保留完全专业化的模板?
- r - 测试和训练集的分层拆分
- python - 从 tkinter 输入框中创建带有 2 个整数变量的 if 语句
- ios - 将异步块回调转换为同步返回值
- r - 如何在缺少值的地方插入 0