node.js | ensureAdmin中间件功能无法正常工作

时间:2017-08-28 13:04:34

标签: javascript node.js

我正在开发一个中间件函数,如果登录用户在允许访问请求的页面之前具有role = 2,则该函数应检入db。如果用户没有角色= 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未定义。可能在这个之后还有更多错误,我无法解决,所以如果有人能告诉我我做错了什么并且如果他想要修复代码那就太棒了。我是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();
    }

}

2 个答案:

答案 0 :(得分:1)

如果您在不同的文件中,请对您的函数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提到

答案 1 :(得分:1)

首先,你必须从实施它的文件中export你的isAdmin函数

export default isAdmin

然后require在您要使用它的文件中

const isAdmin = require('../middlewares/isAdmin');  // wherever you've put this file

由于您的isAdmin函数是异步并返回一个承诺,因此当此承诺解决时,您必须调用next()

isAdmin().then(() => next(), () => res.redirect('/'));