在我的快速应用程序中,我有一个名为helpers的模块,几乎所有的路由和模块都需要这个模块。此模块具有记录方法,可以记录为流利(但这并不重要)。在构建要记录的数据时,我想添加请求的唯一标识符,以便为同一请求编写的所有日志具有相同的唯一ID。在应用程序入口点app.use中使用全局变量不起作用,因为每次新请求命中时都会覆盖此变量,因此在高负载或长时间运行的任务中,全局uuid将发生变化。 res.locals在路由之外是不可用的,所以我不能在这个问题上使用它。有没有办法创建一个var,每个请求都是唯一的,并且可以在每个模块中使用,或者可以在路由之外访问res.locals数据?谢谢
修改
也许一个例子有助于更好地理解这个问题。 假设我有一个名为helpers.js的模块,如下所示:
let helpers = {};
helpers.log = (logData, logName) => {
fluentLogger.emit('', {
name: logName,
//uuid: the needed uuid,
message: logData
});
}
module.exports = helpers;
现在显然我可以在我的app.js入口点执行此操作:
app.use(function (req, res, next) {
res.locals.uuid = uuid.v4();
next();
});
然后在每个需要帮助程序的加载中间件模块中(向helpers.log方法添加一个新参数):
const helpers = require('helpers');
router.post('/', (req, res, next) => {
helpers.log('my log message', 'myLogName', res.locals.uuid);
next();
});
这通常会奏效。但是假设一个大型或中型项目,其中有数百个自定义模块和模型(而不是中间件),并且模块可能需要其他模块,这些模块需要最终需要帮助器模块的其他模块。在这种情况下,我应该将res.locals.uuid作为参数传递给每个方法的每个方法,以便我在logger方法中使用它。不是一个好主意。假设我在中间件函数中有一个名为dbmodel.js的新模块:
const helpers = require('helpers');
let dbmodel = {};
dbmodel.getSomeData = (someParam) => {
//some logic
helpers.log('my log message', 'myLogName');
}
module.exports = dbmodel;
如果我没有从中间件传递resm.locals数据,dbmodel就不知道它,所以helpers.log方法也不知道这个。
在PHP中,通常会在应用程序的入口点编写一个GLOBAL var,因此假设的记录器函数可以在应用程序的任何类的每个方法请求中访问此全局变量。
希望这个解释会有所帮助:)谢谢
编辑2
此类问题的解决方案是CLS。感谢@robertklep提示。可以在此处找到一个很好的slidehare解释完全相同的问题(具有唯一ID的记录器)并解释CLS解决方案:https://www.slideshare.net/isharabash/cls-and-asynclistener
答案 0 :(得分:3)
我在这里回答了一个非常类似的问题,可以解决这个问题。 我过去常常解决库node-uuid和continuation-local-storage的问题。看看这个问题的答案,看看它是否有帮助:
NodeJS Express - Global Unique Request Id
你想要一个更大的解释,看看这里:
Express.js: Logging info with global unique request ID – Node.js
答案 1 :(得分:0)
是的,您可以通过一种方法来实现 每个请求都到他的路由传递中间件内的请求。 假设你有
app.get('/', function(req, res) {
res.sendFile(path.join(public + "index.html"));
});
请求。
将中间件放入其中。并编辑req字段,这样您将获得每个请求的唯一变量值
看看这个。 https://expressjs.com/en/guide/writing-middleware.html
喜欢这个
var requestTime = function (req, res, next) {
req.requestTime = Date.now()
next()
}
app.use(requestTime)
app.get('/', function (req, res) {
var responseText = 'Hello World!<br>'
responseText += '<small>Requested at: ' + req.requestTime + '</small>'
res.send(responseText)
})
此处req.requestTime对每个请求都是唯一的。