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