2017-09-18 7 views
-1

複数の言語でURLをサポートするNode Webアプリケーションがあります。私は現在のURLのウェールズ版を生成するためのミドルウェアをいくつか持っています(例えば、URLは/foo、ウェールズ版は/welsh/fooとなります)。これはリンク上に表示されます。Node/Expressでrequest.urlを取得する際の競合条件

この関数はrequestオブジェクトを受け取り、更新されたURL(request.urlでアクセス)を返します。残念ながら、自分のサイトで複数のページを一度に開くと、一部のページは<a>リンクで間違ったURLを取得します(たとえば、私が開いた他のページの1つにWelsh URLが表示されます)。ページをリロードすると、今回はリンクが再生成されます。その後、私はgetCurrentUrl(request, 'welsh')のようなテンプレートでそれを呼び出す...

res.locals.getCurrentUrl = (req, locale) => { 
    // snip: some logic to check if the URL already contains the locale 
    return "://" + req.get('host') + req.originalUrl; 
}; 

私のミドルウェアは、このようになります。

JavaScriptを使用して一度に十数個のタブを開くと、この現象が発生します(一度にたくさんのサイトURLを開くボタンが付いたステータスページがあります)。明らかに、これは実用的なユースケースではありませんが、交通量の多い瞬間に、この競合状態が起こる可能性があります。urlなどのリクエストごとの変数をレンダリングしたほうが信頼性の高い方法がありますか?出力?私は何か間違っているのですか?

答えて

1

(事前に、私ははっきりと、この競合状態を導入したテンプレートエンジンのグローバルとして設定)ミドルウェア機能に私のテンプレートが利用可能なrequestオブジェクトを作ることによって、これを修正:

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

ラムダ関数を使用している可能性があり、外側の範囲を保持している可能性があります。

ではなく

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

を試してみてください。

+0

はこれを試していない - 何の喜びを。 –

+0

OK。試してみる価値があった。私はどこかにグローバル変数があると思います。すべての変数を初期化し、可能な限り使用に近いものとして宣言してください。それと幸運。 – theGleep

関連する問題