我有一台定义了以下内容的服务器:
app.get('/', function(req, res) {
// gets something
}
app.post('/', function(req, res) {
// updates something, need to be authenticated
}
现在我希望post
操作仅适用于经过身份验证的用户,因此我想在它们之间添加auth
中间件,如下所示:
app.get('/', function(req, res) {
// gets something
}
app.use('/', function(req, res) {
// check for authentication
}
app.post('/', function(req, res) {
// updates something, need to be authenticated
}
这样,GET
即可通过,POST
用户必须经过身份验证。
问题是express不会进入我的app.use
中间件。如果我将app.use
中间件放在所有app.VERB
路由之前,它就可以工作。
有没有办法像我想的那样去做?
答案 0 :(得分:4)
当您声明第一条路线时,Express会自动将app.router
插入中间件链。由于路由器可以处理任何后续路由,因此在第一条路由之后声明的任何中间件都无法处理您的路由。
但是,您可以使用路由处理程序与中间件非常相似的事实,而不是使用app.use
:
app.get('/', function(req, res) {
// gets something
});
app.all('/', function(req, res, next) { // catches GET, POST, ... to '/'
// check for authentication
});
app.post('/', function(req, res) {
// updates something, need to be authenticated
});
但是如果你只有一条需要通过中间件传递的路由,那么遵循@hiattp的建议并立即将中间件添加到路由声明中是有意义的。
答案 1 :(得分:2)
我喜欢将这种类型的检查放在可重用的方法中并将其传递给路由处理程序:
function ensureAuth(req, res, next){
if(req.user) next(); // Auth check
else res.redirect('/');
}
app.post('/', ensureAuth, function(req,res){
// User is authenticated
}