我有一个单例记录器文件。当请求进入Express时,我使用中间件设置请求ID。
// Relevant parts of server.js
import express from 'express';
import requestIdMiddleware from './request-id-middleware';
const app = express();
app.use(requestIdMiddleware);
-
// Relevant parts of request-id-middleware.js
const uuid = require('uuid/v4');
const { setRequestId } = require('./logger');
module.exports = function(req, res, next) {
const id = uuid();
req.id = id;
// This sets a static variable on the plain logger object
setRequestId(id);
next();
};
-
// Relevant parts of logger.js
module.exports = {
request_id: null,
setRequestId: id => {
this.request_id = id;
},
log: message => {
// sends a log out using this.request_id, which is shared by all users of the server
}
}
现在使用普通对象意味着每个人都共享相同的价值。因此,尽管每个请求都调用setRequestId
,这意味着如果第一个请求花费的时间长于第二个请求,则在引用记录器的值时它可能会使用第二个请求的ID。
似乎我需要使记录器成为一个类,而不是一个普通的对象,在我的请求中间件中实例化它,然后传递实例以确保来自同一请求的多个调用的唯一请求ID。尽管不太可能,但希望找到一种方法来解决需要将变量向下传递到我要记录的任何内容中的问题。