2016-10-26 6 views
4

私はNode.js + Express JSを使用してAPIを開発しました。私はトークンベースの認証を使用しています。Express JS Routerミドルウェア抽象化

私は、このAPIでuserRoute(/ USER)とpostRoute(/ POST)という2種類のルータを使用しました。 postRouteは認証内で使用できますが、userRouteにはトークンが必要です。

は私がuserRouteのためのルータのミドルウェアを使用することを解決するために、それはportRoute

と干渉するこれはコードです:

... 

var postRoute = express.Router(); 
var userRoute = express.Router(); 


// Route middleware to verify a token 
userRoute.use(function(req, res, next) { 
    security.checkToken(req,res, next); 
}); 


userRoute.route('/users') 
    .get(userCtrl.findAllUsers) 
    .post(userCtrl.addUser); 


postRoute.route('/posts') 
    .get(userCtrl.findAllPosts) 
    .post(userCtrl.addPost); 


app.use(userRoute); 
app.use(postRoute); 

... 

i 'は/投稿のサーバがアクセスしようとした場合には、トークンをチェックし、私はapp.useの順番を変えるかどうかは知っていますが、それはうまくいきますが、私が "Router Middleware"を使っているなら、なぜこのように動作するのか分かりません。

誰かが知っていますか?

答えて

1

これは、エクスプレスルータの実装では、見ていると非常に簡単に理解できるためです。パスはnode_modules/express/lib/router/index.jsです。

var proto = module.exports = function(options) { ... } 

、すべてのを戻されている別のルータのインスタンスがあることは事実である:あなたがルーター(呼び出すたびに)、あなたのケースで

var postRoute = express.Router(); 
var userRoute = express.Router(); 

のように、この関数が呼び出されます時間。違いは、useがミドルウェアを登録しているという点です。あなたがuseを見るように、それがproto.use

proto.use = function use(fn) { ... } 

に対して登録されている、これはあなたがそこに登録ミドルウェアは、彼らはあなたが定義するには、ルータのすべてのインスタンスのために登録されることを意味します。

+0

あなたの答えをありがとう。しかし、アプリケーションのミドルウェア「app.use(...)」を登録するときには、ルーターミドルウェア「yourRoute.use(...)」を使用するときにはそうではないという理論があります。そうでない場合、アプリミドルウェアとルータミドルウェアの違いは何ですか? – WikiCode

+0

@WikiCodeもう一度、ソースコード 'node_modules/express/lib/express.js'行をチェックすると、これは' mixin(app、proto、false); 'から理解できます。ミドルウェアをルートに登録したい場合は、 'app.use( '/ users')、function(req、res、next){ security.checkToken(req、res、next); }); 'あなたもここで見ることができます:http://stackoverflow.com/questions/28305120/differences-between-express-router-and-app-get –

+0

@WikiCode多分私はそれについて間違っています!私はvar名と混同しています。私はちょっと戻ってきます。 –