我有一个Node webapp,它支持多种语言的URL。我有一些中间件来生成当前URL的威尔士版本(例如,对于URL /foo
,威尔士版本将是/welsh/foo
),它在页面上显示为链接。
此函数接受request
对象并返回更新的URL(通过request.url
访问)。不幸的是,当我在我的网站上一次打开多个页面时,某些页面在<a>
链接中获取了错误的URL(例如,他们获得了我打开的其他页面的威尔士URL)。如果我重新加载页面,则会重新生成链接,这次正确。
我的中间件看起来像这样:
res.locals.getCurrentUrl = (req, locale) => {
// snip: some logic to check if the URL already contains the locale
return "://" + req.get('host') + req.originalUrl;
};
...然后我在getCurrentUrl(request, 'welsh')
等模板中调用它。
当我一次打开十几个标签时,我才会看到这种行为(通过JavaScript - 我的状态页面上有一个按钮,可以同时打开一堆网站网址)。显然,这不是一个真实的用例,但在高流量时,这种竞争条件可能会起作用。
这里有更好,更可靠的方法将每个请求变量(如url
)与渲染输出相关联吗?我做错了吗?
答案 0 :(得分:1)
通过在中间件函数中使我的模板可以使用request
对象来解决此问题(事先我将其设置为模板引擎上的全局,这清楚地介绍了这种竞争条件):
app.use(path, (req, res, next) => {
res.locals.request = req;
return next();
});
答案 1 :(得分:0)
您可能正在使用Lambda函数,而这些函数保留在外部范围内。
尝试
res.locals.getCurrentUrl = function() {...}
代替。