2016-12-16 38 views
0

在下面的代碼中,我想限制未經授權訪問'restrictedRoutes'路線。但是在這種情況下,「restrictedRoutes」會影響除「路由器」之外的任何路由。例如,如果我嘗試訪問'/ test',我想得到404錯誤,但是我卻得到了關於無效令牌的JWT錯誤,如果沒有提供。Express JS路由器中間件

我該如何創建中間件,這隻會影響某些'路由器'提供的路由?

/* 
* API Routes file 
*/ 
var jwt = require('jsonwebtoken'); 

var router = require('express').Router(); 
var restrictedRouter = require('express').Router(); 

module.exports = function (express, app) { 
    //Default routes 
    router.get('/login', app.controllers.HomeController.login); 

    restrictedRouter.use(function (req, res, next) { 
     try { 
      var tokenArray = req.headers.authorization.split(' ', 2); 
      if (jwt.verify(tokenArray[1], 'shh')) 
       next(); 
     } catch (exception) { 
      res.status(401).json({error: exception.message}); 
     } 
    }); 

    //Restricted routes 
    restrictedRouter.get('/', function (req, res) { 
     res.send('Success'); 
    }); 

    express.use(router); 
    express.use(restrictedRouter); 
}; 

回答

1

將路由器掛載到您想要限制的某個路徑。

app.use('/restricted', restrictedRouter); 

另外,我會避免一起expressapp傳遞的混亂就像你正在做,而是做這樣的:

index.js

var express = require('express'); 
var app = express(); 
var routes = require('./routes'); 

app.use('/restricted', routes.restrictedRouter); 
app.use(routes.router); 

routes.js

var express = require('express'); 
exports.router = express.Router(); 
exports.restrictedRouter = express.Router(); 

router.get('/login', app.controllers.HomeController.login); 

restrictedRouter.use(function (req, res, next) { 
    try { 
     var tokenArray = req.headers.authorization.split(' ', 2); 
     if (jwt.verify(tokenArray[1], 'shh')) 
      next(); 
    } catch (exception) { 
     res.status(401).json({error: exception.message}); 
    } 
}); 

//Restricted routes 
restrictedRouter.get('/', function (req, res) { 
    res.send('Success'); 
}); 

你的另一種選擇是使用每個路由中間件:

var authMiddleware = function (req, res, next) { 
    try { 
    var tokenArray = req.headers.authorization.split(' ', 2); 
    if (jwt.verify(tokenArray[1], 'shh')) 
     next(); 
    } catch (exception) { 
    res.status(401).json({error: exception.message}); 
    } 
}); 

router.get('/', authMiddleware, function(req, res) { 
    res.send('Success'); 
}); 
+0

應用 - 從與控制器和模型的應用程序「文件夾自動加載的文件。 app.use('/ restricted',routes.restrictedRouter); - 感謝這個解決方案) – user3169724