Cannot read property from mongoDB
Closed this issue · 3 comments
I've got User schema with role parameter. I'm using your example with usage of connect-roles (I changed var user to var role and configured permissions:
role.use('profile.view', function (req) {
if(req.user.role === 'user') {
return true;
}
});
role.use(function (req) {
if (req.user.role === 'admin') {
return true;
}
});
Those are my configured routes:
app.get('/profile', role.can('profile.view'), function(req, res) {
profile.profile(req, res);
});
app.get('/admin', role.is('admin.'), function(req, res){
admin.admin(req, res);
});
In view I'm using
if userIs('admin')
li
a(href='/admin')
| Admin
li
a(href='/profile')
| Profile
li
a(href='/logout')
| Log Out
However I've issue when I've:
role.use(function (req) {
if (req.user.role === 'admin') {
return true;
}
});
That: Cannot read property 'role' of undefined
When I'm deleting this rule it's working correct however I don't have admin menu.
I'm not sure why you would be getting that behaviour. Could you provide the stack trace? Also try doing console.log(req)
or console.log(req.user)
inside the role handlers and see what values you get.
So I've added as you said:
role.use(function (req) {
console.log("User role is: " + req.user);
if (req.user.role === 'admin') {
return true;
}
});
And that's my trace:
TypeError: c:\Users\mrmr\WebstormProjects\str\views\layout.jade:32
30| span.icon-bar
31| a.navbar-brand(href='/')= brandName
> 32| .navbar-collapse.collapse
33| ul.nav.navbar-nav
34| ul.nav.navbar-nav.navbar-right
35| if userIs('admin')
Cannot read property 'role' of undefined
at app.get.passport.authenticate.passReqToCallback (c:\Users\mrmr\WebstormProjects\str\app.js:86:17)
at ConnectRoles.test (c:\Users\mrmr\WebstormProjects\str\node_modules\connect-roles\index.js:104:18)
at c:\Users\mrmr\WebstormProjects\str\node_modules\connect-roles\index.js:136:18
at eval (eval at <anonymous> (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:179:8), <anonymous>:157:6)
at eval (eval at <anonymous> (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:179:8), <anonymous>:444:22)
at res (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:180:38)
at Object.exports.render (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:305:10)
at Object.exports.renderFile (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:341:18)
at View.exports.renderFile [as engine] (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:326:21)
at View.render (c:\Users\mrmr\WebstormProjects\str\node_modules\express\lib\view.js:76:8)
User role is: undefined
Sorry for the slow response. It looks like you are probably only getting this with un-authenticated users. Hence req.user
being undefined. What you may want to do is add another rule (before all the other rules) that looks like:
role.use(function (req) {
if (!req.user) {
return false;
}
});
i.e. if there is no user, don't let them do anything.