我是node.js的新手,所以我的问题很简单:
我的路由文件中有此功能,用于检查用户是否经过身份验证
function isLoggedIn(req, res, next) {
if(req.isAuthenticated()){
console.log(req.user);
return next();
}
req.flash('warn_msg', 'Login required');
res.redirect('back');
}
我需要的是一个类似的,也检查用户“清除级别”。
这是我写的:
function isLevel(clearance, req, res, next) {
if(req.isAuthenticated()){
if(req.user.level>=clearance){
return next();
}
else {
req.flash('warn_msg', 'Not enough permissions');
res.redirect('back');
}
}
else {
req.flash('warn_msg', 'Login required');
res.redirect('back');
}
}
问题是我可以像这样使用的第一个
app.get('/newOrg', isLoggedIn, function(req, res) {
res.render('Orgs/newOrg');
});
但我不知道如何将'clearance'参数传递给第二个,并将其称为
app.get('/newOrg', isLevel(3), function(req, res) {
res.render('Orgs/newOrg');
});
给我一个错误,说'req'未定义
我知道我可以解决并检查get路径中的用户级别,但我想要一个“更清洁”的解决方案
答案 0 :(得分:3)
当express加载路由时,它会查找应该引用函数的中间件。在这里你放isLevel(3)
,基本上调用函数并将函数的结果作为中间件。
您需要引用功能。你可以通过创建像这样的函数来做到这一点
function checkLevel3(req, res, next) {
return isLevel(3, req, res, next);
}
然后使用checkLevel3
代替isLevel(3)
。
您还可以创建一个高阶函数,可以根据需要吐出checkLevel3
等函数
function leveler(n) {
return (req, res, next) => isLeveL(n, req, res, next);
}
// now
const checkLevel3 = leveler(3);
答案 1 :(得分:0)
你不能运行这个功能,但你需要传递一个引用,所以express可以在需要的时候调用它。所以为了传递价值,你需要做两件事之一。
您可以为req添加新对象以供临时使用,或使用express-session
在多个请求之间进行更“永久”的使用。在您的情况下,express-session
看起来最好。
它看起来像这样
const session = require('express-session')
// Setup session management
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}))
// Set the session
app.get('/auth', (req, res) => {
req.session.clearance = 3
res.redirect('/newOrg')
})
// Run isLevel
app.get('/newOrg', isLevel, (req, res) => {
})
// Get the session
function isLevel(clearance, req, res, next) {
console.log(req.session.clearance)
}