我应该说这纯粹是一个统计的东西,需要99%的精确和方向正确。 换句话说,有一点犯错的余地。
我目前使用一个中间件来完成这一工作,该中间件检查req.headers.referer,如果用户不是来自我的某个页面,则更新Mongo。 这导致我对app.get的几乎每个实例都进行了添加。 这是可行的,但我不知道这是不是正确的解决方案。
我担心的是-
>
看起来开始乱七八糟了。 我觉得我正滑向中间件地狱,几乎每一条路由都需要我添加的每一个中间件。 很多重复的电话。 很多看起来很像的代码。
效率高吗? 我知道每个请求只会调用它一次,所以我关心的确实是上面提到的。 在用户得到响应之前,我正在开始一个会导致中间件长链的事情?
(我对Node,Express和Mongo都是新手,所以如果你想知道为什么我没有做一些显而易见的事情,可能就是这个原因)
不必将中间件添加到每条路由中,您可以将此中间件定义为应用程序级别的中间件,为每个请求执行该中间件。 在中间件内部,您可以过滤出它不应该运行的几条路由:
const excludedPathsForStatistics = ['/your/exlcude-paths-here'];
const yourStatisticMiddleware = function(req, res, next) {
if(excludedPathsForStatistics.some(path => path === req.path) {
next();
} else {
YourStatisticService.updateStatistics(req, res, next);
}
}
app.use(yourStatisticMiddleware);
关于性能--是的,这将为每个请求运行,但只要您确保没有阻塞updateStatistics()
内部的事件循环,它就不应该是什么大问题。