2016-05-11 101 views
3

因此,当我登录到我的网站并在同一网址内导航时(例如:localhost/private/xxxx),res.locals.user会返回一个对象。res.locals变量为空或超出范围?

当我超出范围(例如:localhost/xxxx)时,res.locals.user为空。

/app.js

... 
app.use(passport.session()); 
app.use(require('./controllers')); 
... 

/控制器/ index.js

router.use('/private', require('./member.js')); 
router.use('/admin', require('./admin.js')); 

/* Some basic routes. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { ... }); 
}); 

洛在res.locals.user后仍然空在这里


/控制器/ member.js

router.use(function isMember(req, res, next) { 
    if(req.isAuthenticated()) { 
    res.locals.user = req.user; 
    return next(); 
    } 
    req.flash('error', 'WHY YOU LITTLE!'); 
    res.redirect('/login'); 
}); 

router.get('/', function(req, res, next) { 
    res.redirect('/private/index'); 
}); 

router.get('/something', function(req, res, next) { 
    res.redirect('/private/somehting'); 
}); 

router.get('/darkside', function(req, res, next) { 
    res.redirect('/private/darkside'); 
}); 

res.locals.user正确返回用户,我是否转到/私人/私营/东西/私营/暗边

是否为ca使用router.use('/private', require('./member.js'));时我使用中间件路由吗?我该如何解决?

回答

1

最后我只是不得不从member.js我的所有路由之前添加

router.use(function (req, res, next) { 
    if(req.isAuthenticated()) { 
    res.locals.user = req.user; 
    } 
    return next(); 
}); 

和删除res.locals.user = req.user;文件

所以它会给我这样的:

/controllers/index.js

router.use(function (req, res, next) { 
    if(req.isAuthenticated()) { 
    res.locals.user = req.user; 
    } 
    return next(); 
}); 

router.use('/private', require('./member.js')); 
router.use('/admin', require('./admin.js')); 

/* Some basic routes. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { ... }); 
}); 
2

res.locals是传递给您的应用程序的渲染引擎的对象。您可以在护照认证策略中设置req.session.user = user的用户详细信息。因此,您可以通过任何路由访问用户。

+0

这样做的问题是,我需要将用户添加到我的每个路线(大约30+)。 res.locals.user避免了这一点,因为它是正确的接受我的模板文件。 – Goowik