我正在研究中间件功能,如果登录的用户在允许访问请求的页面之前具有角色= 2,那么该功能应该检查数据库。如果用户没有角色= 2,他应该被重定向到主页(/)。我写了下面的函数来实现这一目标:node.js | ensureAdmin中间件功能不起作用
isAdmin = function(req, res, callback) {
let Users = require('./models/users');
Users.findOne({ 'steam.id': req.user.steam.id }, 'role', function(err, data) {
if(err) {
return callback(err, false);
} else {
if(data.steam.role === undefined || data.steam.role != 2) {
return callback(null, false);
} else {
if(data.steam.role === 2){
return callback(null, true);
}
}
}
});
};
下面的函数被放置在app.get(/管理)我的路线文件的一部分
function ensureAdmin(req, res, next) {
if (isAdmin()) {
return next();
}
console.log(colors.red('[ATTENTION] ') + colors.red('A non admin tried to access admin-only pages'));
res.redirect('/');
}
app.get:
app.get('/admin', ensureAuthenticated, ensureAdmin, function(req, res){
res.send('Admin panel!');
});
当我尝试访问/管理页面时,我只得到一个ReferenceError:isAdmin没有定义。可能在这个之后还有更多的错误,我无法解决,所以如果有人能告诉我我做错了什么,并且如果他愿意的话修复代码,那将是非常好的。我是一个初学者的Node.js :)
EDIT(新代码):
module.exports = function(isAdmin){
var isAdmin = function(req, res, callback) {
if(req.user.steam.role === undefined || req.user.steam.role != 2){
return callback(null, false);
} else {
if(req.user.steam.role === 2){
return callback(null, true);
}
}
};
}
。
let isAdmin = require('../functions/isAdmin');
function ensureAdmin(req, res, next) {
if(isAdmin()) {
return next();
}
}
isAdmin是异步的,你不能只是调用'如果(isAdmin()){}' –
如果你已经有一个用户装上了请求对象,你为什么在数据库中,以检查他们的作用是什么?你不应该能够检查req.user.steam.role吗? – Paul
感谢保罗,我实施了你的建议:) – DerJP