2012-04-27 10 views
2

私は、明示的にそれをapp.get()argリストに置かずに、デフォルトで呼び出されるルートミドルウェアをExpressで作成できるかどうかを知りたがっていましたか?Nodejsすべてのルートに暗黙のミドルウェアを適用しますか?

// NodeJSは私がapp.set('data', data)を行うと、ルート内req.app.settings.data経由でアクセスすることができます理解

var data = { title: 'blah' }; 

// So I want to include this in every route 
function a(){ 
    return function(req, res){ 
    req.data = data; 
    }; 
}; 

app.get('/', function(req, res) { 
    res.render('index', { title: req.data.title }); 
}; 

を初心者くさいです。上記の私の単純な例をおそらく満たすでしょう。

+0

FYI関数a(){戻り関数()は私にはあまりにも不愉快だよ – Mustafa

答えて

9
function a(req, res, next){ 
    req.data = data; 
    // Update: based on latest version of express, better use this 
    res.locals.data = data; 
    next(); 
}; 

app.get('/*', a); 

Express docs, Middleware sectionの例を参照してください。

+0

ありがとう、かなり私が探していたもの。 –

+7

これをapp.allにマップするといいでしょう(ただし、 )。投稿リクエストに対してもその実行が行われていることを確認してください。 – jascha

+0

は、代わりに 'res.locals.data = data;'を返すように答えを更新しました –

1

ます。また、このようにそれを行うことができます。クッキーとセッションがすでに用意されていたときに、この場合のmy_middlewareで

function my_middleware(req, res, next){ 
    req.data = data; 

    if (something(res)) redirect('http://google.com'); // no access to your site 
    next(); // go to routes 

}; 

app.configure(function() { 
    ... 
    app.use(express.cookieParser('secret')); 
    app.use(express.session()); 
    app.use(my_middleware); 
    app.use(app.router); 
    ... 
} 

が呼び出されますが、ないルートはまだ処理されていません。何らかの理由でそれが必要な場合は、セッションの前に行うこともできます。

4

新しいエントリごとに明示的に新しいルートを作成する必要なく、作成したすべてのビューを呼び出すデフォルトの方法を作成できます。次の例をご覧ください。

app.get('/:viewname', function(req, res) { 
    res.render(req.params.viewname, { viewname : req.params.viewname}); 
}); 

お待ちしております。

+0

これはうまくいきました。私は単純なページをレンダリングするために同じ呼び出しをたくさん書かないというのが好きです。ただし、まだ実装されていないページでは、404から500に変換されます。 (初心者の質問、そのケースをどう扱うか?) – prototype

関連する問題