我有一个应用,其中某些页面要求用户登录。
我不确定是否有内置的内容,但我所做的是如下:
app.use((req, res, next) => {
if (req.session.username) {
app.get('/project/create', projectCtrl.create)
app.get('/project/create/save', projectCtrl.save)
} else {
return res.redirect('/')
}
next()
})
这是正确的做法,还是有更好的表达方式?我这样做的方式有点像哈克。
答案 0 :(得分:1)
是的,这是一种正确的做法。您拥有的是express
中的 应用程序级中间件 。它会被应用程序收到的每个请求调用。
您可以提取username
支票并将其应用为 路线中间件亚组件 。这样,中间件只会针对它应用的路由执行。
function gatePass(req, res, next) {
if(req.session.username) {
next();
}
else {
return res.redirect('/');
}
}
app.get('/project/create', gatePass, projectCtrl.create)
app.get('/project/create/save', gatePass, projectCtrl.save)
如果您希望通过将 express router 与 路由级中间件 一起使用来分离问题,可以更进一步。这也将中间件直接应用于路由。
var router = express.Router();
router.use('/project/create', gatePass);
router.use('/project/create/save', gatePass);
router.get('/project/create', projectCtrl.create);
router.get('/project/create/save', projectCtrl.save);
app.use('/', router);
答案 1 :(得分:0)
这个解决方案的工作。它不是最好的,但对于小项目来说它会很好。唯一的缺点是您需要定义要通过会话检查的每条路线。
Nodejs是中间件的世界,为什么不使用它呢?我认为这是最好的事情。
验证是我导出中间件的文件,我将其应用到我的所有路由器上..(在这种情况下,只是为了检查用户是否已登录)
var verify = require('./verify');
router.all('/*', verify.isLogged, function(req, res, next) {
if(req.decoded._doc.isLogged == "") {
next();
}
else {
res.json("error");
}
});
这样,如果将来你需要检查一件事,然后再检查一件事,你只需要调用你要检查的功能
router.get('/test', verify.isLogged, verify.isAdmin function(req, res, next) {
if(req.decoded._doc.isAdmin == "") {
next();
}
else {
res.json("error");
}
});