在Node / Express中获取request.url时的竞争条件

时间:2017-09-18 13:53:58

标签: javascript node.js express

我有一个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)与渲染输出相关联吗?我做错了吗?

2 个答案:

答案 0 :(得分:1)

通过在中间件函数中使我的模板可以使用request对象来解决此问题(事先我将其设置为模板引擎上的全局,这清楚地介绍了这种竞争条件):

app.use(path, (req, res, next) => {
    res.locals.request = req;
    return next();
});

答案 1 :(得分:0)

您可能正在使用Lambda函数,而这些函数保留在外部范围内。

尝试

res.locals.getCurrentUrl = function() {...} 

代替。