Express 中间件受保护和不受保护的路由

Express middleware protected and unprotected routes

我在 /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)

当我从 POST 到 /users 时,它运行预期的路线,但是当调用 next() 时,protected_middleware 运行。发生这种情况是因为它在标有 'D'.

的行找到下一个 /users 定义

解决此问题的推荐方法是什么?

对于每个资源,我希望能够在每个路由中使用不同的中间件。

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

这里不需要两个单独的路由器,只需在需要的地方使用受保护和不受保护的中间件(在路由器 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);