javascript - Node .js | EnsureAdmin 中间件功能不起作用

标签 javascript node.js

我正在开发一个中间件功能,该功能应该在允许访问请求的页面之前检查登录用户是否具有 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/

相关文章:

javascript - 滚动一定距离后弹出文本不起作用

javascript - 在 React 中确认 'Go Back' 的导航

javascript - 道场/迪 git : set entries id attribute in select

javascript - Blackberry Web Works 如何在每次启动应用程序时触发事件

node.js - mongodb nodejs db.collection 不是函数

javascript - 尝试通过计算创建数组时数组长度无效

angularjs - 使用 ngRoute 进行 Angular 路由不适用于某些路由

javascript - 在测试中开 Jest 多个方法调用会导致错误的期望

javascript - 如何在 Strapi 中更新用户

javascript - 我可以用什么来替换嵌套的异步回调?