我正在开发一个中间件功能,该功能应该在允许访问请求的页面之前检查登录用户是否具有 Angular 色= 2。如果用户没有 Angular 色 = 2,他应该被重定向到主页 (/)。我编写了以下函数来实现这一目标:
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(/admin) 部分
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!');
});
当我尝试访问/admin 页面时,我只是收到一个ReferenceError: isAdmin is not Defined。在这之后可能还有更多我无法解决的错误,所以如果有人能告诉我我做错了什么并修复代码(如果他愿意),那就太好了。我是一个 Node.js 初学者:)
编辑(新代码):
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 进行导出,并返回该函数,因为它是异步的
var isAdmin = function(req, res, callback) {
let Users = require('./models/users');
return 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);
}
}
}
});
};
export default isAdmin
此外,调用必须是可用的
function ensureAdmin(req, res, next) {
isAdmin().then(response => {
next();
});
}
我注意到您编写了console.log res.redirect,这在中间件中调用next()
后没有任何意义。您可以将此 console.log()
移到 next()
调用之前。避免在中间件中使用 res.redirect()
最后,假设您正在导入文件以及 @hansmaad 提到的
关于javascript - Node .js | EnsureAdmin 中间件功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45919772/