如何使用路线操纵导航栏?

时间:2015-12-13 05:27:03

标签: javascript html node.js express

我的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('/');
 });
});

虽然这似乎有效,但我需要将islogissignlossign变量添加到我拥有的每个网页中。

有更好的方法吗?

3 个答案:

答案 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元素。