2016-04-05 9 views
0

私はExpressの初心者で、ミドルウェアをどのように処理するのかちょっと混乱していますか?私は私のカスタムミドルウェアのように見えるapp.use(require('_/app/middleware/shareLocals'))を追加したいExpressはミドルウェアをどのように再調整しますか?

app.use(require('_/app/middlewares/errors/404')) 
app.use(require('_/app/middlewares/errors/500')) 

var log = require('_/log') 

module.exports = function (req, res, next) { 
    log.warn('page not found', req.url) 
    res.status(404).render('errors/404') 
} 

var log = require('_/log') 

module.exports = function (er, req, res, next) { 
    log.error(er.message) 

    res.locals.error = er 
    res.status(500).render('errors/500') 
} 

をだから今:だから基本的に私は次のようになりますこれは2つのミドルウェアを持っています:

module.exports = function (req, res, next) { 
    res.locals.base_url = req.protocol + '://' + req.get('host'); 

    next(); 
} 

主な問題は、Expressはミドルウェアが何をすべきかを理解し、どのように...私はbase_urlを使用しようとすると、今、私は404エラーを取得すること

のですか?それは私のミドルウェアと404の間で視覚的な違いがありません:

  • それはミドルウェアを感じ出現だけで404エラー

を投げ、それはそれでどんなif'sを持っていない同じのparams

  • を受け取りますExpressのエラー(最初のパラメータとしてエラーを除く)と404のエラー(最初のエラーがない場合)...

    PS ルートの前後にミドルウェアを定義する違いはありますか?

  • 答えて

    1

    P.S.ルートの前後にミドルウェアを定義する違いはありますか? はい。

    あなたのミドルウェア(およびルート)を登録する順序には、多くのことが言えます。

    Image巨大なリストとして表現します。リスト内の最初の要素から始めて、定義した最初のミドルウェアORルート、次に2番目のものなどがあります。

    expressがリクエストを受け取ると、ルート/ミドルウェアのルート/名前と一致するように見えますヒットした場合、ミドルウェア/ルートを実行し、潜在的に「next()」コールを待ちます。

    ルート "/ test"がある場合、 "/ test"に一致するリクエストがある場合にのみ実行されます。異なる名前のルートは明らかに起動されません。ミドルウェアは、app.use( "/ test"、middlewareA)という名前も持つことができます。これは "/ test"が要求された場合にだけトリガされます。あなたのやり方では、ルートネームスペース内のすべてのリクエストは、app.use(middlewareA)にトリガーされます。それはワイルドカードのようなものです。

    ここでは、注文したことの意味へ: 404ミドルウェアは、すべてのルートが定義された後にのみ使用してください。その方法では、リストが404ミドルウェアに達したときに、実際にルートが見つかりませんでした。

    ミドルウェアの終了時に結果を返す/しないnext()を呼び出すと、フローに問題が発生する可能性があります。私はこれについて詳細には触れないが、それに気付いている。

    私は自分のミドルウェアが404ミドルウェアの後に追加されていると推測しています。それはおそらく問題です。そうでない場合は、コードをもっと譲り渡して、よりよく見えるようにしてください。しかし、覚えて、順序はすべてです:)

    関連する問題