2017-08-28 45 views
0

我正在研究中间件功能,如果登录的用户在允许访问请求的页面之前具有角色= 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(); 
    } 

} 
+2

isAdmin是异步的,你不能只是调用'如果(isAdmin()){}' –

+0

如果你已经有一个用户装上了请求对象,你为什么在数据库中,以检查他们的作用是什么?你不应该能够检查req.user.steam.role吗? – Paul

+0

感谢保罗,我实施了你的建议:) – DerJP

回答

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 

另外,呼叫必须thenable

function ensureAdmin(req, res, next) { 

isAdmin().then(response => { 
    next(); 
}); 

} 

我注意到你已经写了console.log res.redirect,在调用中间件中的next()后没有意义。您可以在next()呼叫之前转移此console.log()。避免res.redirect()中间件

最后,假设你是@hansmaad

+0

谢谢你的建议:)我把Paul的评论考虑在内,并删除了数据库查询。我想现在我的代码不再需要()了吗?我使用我的编辑代码编辑了我的原始文章。你可以看看,如果一切都好吗?不知何故,我被重定向到我的主页,即使我有角色= 2。 – DerJP

+0

我想通了,谢谢:) – DerJP

+0

这是来自保罗的伟大输入。匆忙赶过来。干杯! – kushalvm

1

弗里斯特做一个文件的导入,以及提到的,你必须从那里执行文件export您isAdmin功能

export default isAdmin 

,然后在要使用它

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

由于require它在文件你的isAdmin函数是异步的并返回一个承诺,当这个承诺解决时你必须调用next()

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

谢谢hansmaad :) – DerJP