快速中间件受保护和未受保护的路由

时间:2016-01-12 18:17:56

标签: node.js express middleware

我在/users下有一些路由,我想要一个身份验证令牌和一些我不需要的路由。为了达到这个目的,我做了以下几点。

var protected = express.Router();
var unprotected = express.Router();

unprotected.post('/', function(req, res, next) { // A
   // no auth required
   next();
});

protected.get('/', function(req, res, next) { // B
   // auth required
   next();
});

module.exports = {
    protected: protected,
    unprotected: unprotected
};

然后我按照以下方式安装这些路线。

var users = require('./routes/users');

app.use('/users', unprotected_middleware, users.unprotected); // C
app.use('/users', protected_middleware, users.protected); // D

app.use(resultHandler); // Middleware for sending the response (all routes) 
app.use(errorHandler);  // Middleware for handling errors (all routes)

当我向/users发布POST时,它会运行预期的路由,但是当next()被调用时,protected_middleware会运行。发生这种情况是因为它在标有“D”的行中找到了下一个/users定义。

推荐的解决方法是什么?

对于每个资源,我希望每个路由都有不同的中间件。

POST /users           (no auth)
GET /users            (requires auth)
DELETE /users/{id}    (requires auth and admin access)

1 个答案:

答案 0 :(得分:1)

这里不需要两个独立的路由器,只需在需要的地方使用中间件进行保护和不受保护(在路由器的get / post功能中):

users.js:

var router = express.Router();

router.post('/', unprotected_middleware, 
   function(req, res, next) { // A
     // no auth required
     next();
  }
);

router.get('/', protected_middleware, 
    function(req, res, next) { // B
      // auth required
      next();
    }
);
module.exports = router;

然后:

var users = require('./routes/users');

app.use('/users', users);

app.use(resultHandler); // Middleware for sending the response (all routes) 
app.use(errorHandler);