2

これは私の最初の投稿なので、助けてくれてありがとう:)

main.jsファイルを作成し、作業を簡単にするために、次のようなことをしたいと思っています。

var pages = {
"/profile":{"page":"My Profile","loc":"./contentPages/profile"},
...
...
...
};

for (var item in pages) {
    app.get(item, function(req, res){
        if(req.session.user_id == null){
            res.redirect('/');
            return;
        }


        res.render(pages[item].loc, {
        title:pages[item].page,
        thisPage:pages[item].page
        });
    });
}

今、私が辞書に最後に何が起こっても、常にレンダリングされるページです。このようなことをする方法はありますか、それとも作成したいすべてのページを書き出す必要がありますか?

本当にありがとう!

4

1 に答える 1

3

問題は、によって作成されたすべてのクロージャーがfunction(req, res)同じ変数 ( item) を参照するため、作成されたときの値ではなく、呼び出されたときの値をすべて使用し、それが最後のものになることです。

最も簡単な回避策は、ヘルパー関数を使用してクロージャーを作成することです。

function makeHandler(item) {
  return function(req, res) {
     // copy body of handler function here
  };
}

次に、ループの本体を次のように置き換えます。

app.get(item, makeHandler(item));

これで、各ハンドラーは独自のプライベート コピーを取得し、item作成時の値が常に保持されます。

即時関数呼び出しを使用してクロージャーを作成することもできますが、それではコードが少し雑然としてしまいます。

于 2012-08-03T04:10:18.557 に答える