我们正在将关联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;
}
是否有更好的方法可以针对每个请求进行记录,而无需将记录对象传递给每个函数?
答案 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
希望有帮助。