我的请求对象包含一个唯一的ID,我的应用程序中的每个日志都必须具有此ID。此ID也必须传播到我从后端调用的任何API现在,我将请求对象传递到任何地方。这显然不是一个理想的解决方案。有什么建议吗?
代码流程
客户端------->服务器(生成请求ID,将其用于所有日志)----->将请求ID传递给任何api调用
代码:
app.use(function(req,res,next) {
logger.info("My message",req);
});
答案 0 :(得分:2)
您可以使用continuation-local-storage模块。还有request-local模块,它只是continuation-local-storage之上的一个小层。不要期望continuation-local-storage永远是完美的......你会遇到cls上下文无效的边缘情况。
答案 1 :(得分:1)
以下是使用continuation-local-storage
module的修订解决方案。
这是我的context
模块。到目前为止,它只存储它生成的路径,请求时间和相关ID,如果它在请求中没有收到它。
'use strict';
const continuation = require('continuation-local-storage');
const cuid = require('cuid');
const appName = require('config').get('app_name');
class Context {
static setup(req, res, next) {
const session = continuation.createNamespace(appName);
session.run(() => {
session.set('context', new Context(req));
next();
});
}
constructor(req) {
this.path = req.path;
this.corrId = req.headers['x-correlation-id'] || cuid();
this.requestTime = Date.now();
}
static current() {
return continuation.getNamespace(appName).get('context');
}
}
module.exports = Context;
我的app.js
包括:
const Context = require('./context');
app.use(Context.setup);
之后,任何代码都可以调用Context.current()
来获取Express请求的当前上下文。我将使用它来进行一致的记录。