我的layout.hbs中有一个导航栏:
<div class="collapse navbar-collapse" id="collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href={{sign}}>{{issign}}</a></li>
<li><a href={{los}}>{{islog}}</a></li>
<li><a href="/">Home</a></li>
</ul>
</div>
我想在旅途中更改内容,例如当用户登录时,我想将登录文本更改为注销并重定向到其他页面。我通过路线这样做。
router.get('/', function(req, res, next) {
var vm = {
title: 'Join Fatty-cruxifinier',
sign: 'about',
issign : 'SIGNUP',
islog: 'LOGIN',
los: 'login'
};
res.render('signup', vm);
});
router.post('/', function(req, res, next) {
userServices.addUser(req.body, function(err){
if(err){
var vm = {
title: 'Create an account',
input: req.body,
error: err
};
delete vm.input.password;
return res.render('signup', vm);
}
res.redirect('/');
});
});
虽然这似乎有效,但我需要将islog
,issign
,los
和sign
变量添加到我拥有的每个网页中。
有更好的方法吗?
答案 0 :(得分:1)
您也可以使用res.locals
。当模板编译时,res.locals
中的任何内容都将在Handlebars上下文中可用。所以你可能会制作一些像这样的中间件:
app.use((req, res, next) => {
// get user from cookie, database, etc.
res.locals.user = user;
next();
});
如果您将此中间件放在其他路由之前,则每个响应都可以使用该用户对象。
然后在您的Handlebars模板中,您只需使用条件:
{{#if user}}
<a href=/logout>Logout</a>
{{else}}
<a href=/login>Login</a>
{{/if}}
答案 1 :(得分:0)
您可以捕获所有路由器,并在每次响应之前运行登录逻辑。
var _ = require('lodash');
var parameters = {};
function isLoggedin(req, res, next) {
// check is the user is logged in
res.user = {
// userdata
};
next();
}
// catch all the get routes
app.get(/^(.*)$/, isLoggedin, function(req, res, next){
if (res.user) {
var _parameters = {
title: 'Join Fatty-cruxifinier',
sign: 'about',
issign : 'SIGNUP',
islog: 'LOGIN',
los: 'login'
};
} else {
var _parameters = {
title: 'Join Fatty-cruxifinier',
sign: 'about',
issign : 'SIGNUP',
islog: 'LOGIN',
los: 'login'
};
}
parameters = _.extend(parameters, _parameters);
next();
});
app.get('/account', function(req, res, next){
res.render('signup', parameters);
});
答案 2 :(得分:0)
我在我的项目中做到了这一点,你可以使用类似的方法: -
<强> JS 强>
var cookieuser = req.cookies.userId || '';
res.render('index', {
ID : cookieuser,
data : jsonresponse.entries
});
<强> EJS 强>
<ul class="dropdown-menu">
<% if(ID.length<=0) { %>
<li><a href="/Login">Login</a></li>
<% }else{ %>
<li><a href="/Logout">Logout</a></li>
<li><a href="/History">History</a></li>
<% } %>
这样做,它将userId存储为cookie,哪个节点读取并传递给头部html。 EJS标头检查Id是否为空,否则表示用户已登录。基本上有条件地添加li元素。