【问题标题】:express + hogan how to handle session?express + hogan 如何处理会话?
【发布时间】:2015-07-23 10:49:13
【问题描述】:

我使用expressjshoganjs 下面是我的package.json 和设置。我有疑问是否必须检测会话并在Index.hjs 中仅提供不同的布局。
我应该怎么办?

我在hoganjs中找不到任何关于会话的文档,似乎只处理模板逻辑少?
那么这是否意味着我必须在routes/Index.js 中检测并呈现不同的文件?如何做到这一点的任何例子?

如果我必须让两个文件有重复的部分,那么我试图找到一种方法,比如扩展、包含方法,所以我找到了load other template file inside template,但这似乎不太方便,所以我想知道通常人们该怎么做这个?

package.json

{
  "name": "app",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "express": "~4.13.1",
    "hjs": "~0.0.6",
    "less-middleware": "1.0.x",
    "morgan": "~1.6.1",
    "pg": "^4.4.0",
    "serve-favicon": "~2.3.0"
  }
}

app.js

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hjs');
// end: view engine setup

...

// route handler to each routes
require('./RouteHandler.js')(app, express);
// end: route handler to each routes
...

RouteHandler.js

var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');


var setupRoutes = function(app, express) {
  // uncomment after placing your favicon in /assets
  //app.use(favicon(path.join(__dirname, 'assets', 'favicon.ico')));
  app.use(logger('dev'));
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: false }));
  app.use(cookieParser());
  app.use(require('less-middleware')(path.join(__dirname, 'assets')));
  app.use(express.static(path.join(__dirname, 'assets')));


  var routesIndex = require('./routes/Index');
  var routesAccount = require('./routes/Account');

  app.use('/', routesIndex);
  app.use('/account', routesAccount);

  // catch 404 and forward to error handler
  app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
  });
}


module.exports = setupRoutes;

路由/Index.js

var express = require('express');
var router = express.Router();


router.get('/', function(req, res, next) {
  ...

  res.render('Index/Index', { title: 'Express' });
});


module.exports = router;

索引.hjs

<!DOCTYPE html>
<html>
  <head>
    <title></title>
  </head>
  <body>
    <!-- session exist -->
    <!-- logged in layout -->
    <!-- end: session exist -->

    <!-- session exist -->
    <!-- logged out layout -->
    <!-- end: session exist -->

    ... both 
  </body>
</html>

【问题讨论】:

    标签: javascript node.js session express hogan.js


    【解决方案1】:

    我在hoganjs中找不到任何关于session的文档,好像只能处理模板?

    Hogan 是模板引擎。 它所做的只是流程模板。你是对的。 (见:what is a template engine?

    这是否意味着我必须在 routes/Index.js 中检测并渲染不同的文件?

    没有。

    您应该做的是,渲染 一个 模板,但在该模板中,有条件地显示菜单项

    {{#user}}
      <li><a href="/dashboard">Dashboard</a></li>
      <li><a href="/logout">Logout</a></li>
    {{/user}}
    
    {{^user}}
      <li><a href="/login">Login</a></li>
    {{/user}}
    

    在 Hogan 中,您可以使用上述语法表达与 if 语句等效的内容。 (参见:Hogan If Statements。)

    如果有user 实例,您需要某种方法将其传递给模板。您可以在路由处理程序中执行此操作:

    app.get('/', function(req, res) {
       if (req.isAuthenticated()) {
         res.render('home', { user: req.user });
       } else { 
         res.render('home');
       }
    });
    

    或者,如果您想在每个页面上显示菜单(可能在布局中),您可以创建middleware

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

    在上面的例子中,我使用了Passport 中间件。您将需要实现自己的身份和身份验证系统,但这超出了本问题的范围。

    【讨论】:

    • 感谢解释!!
    • 没问题。如果它回答了您的问题,请考虑将其标记为已接受的答案。谢谢!
    • @user1775888 谢谢:3。
    【解决方案2】:

    Hogan 不处理会话。快递就是这样做的。你需要有一个会话存储,它可以让你在req 对象中存储你想要的东西。 根据您存储的值,您可以将值传递给模板并加载任何内容。

    会话存储 - https://github.com/expressjs/session

    Index.js

    //设置值

    req.session.user.loggedIn = true;

    // 传递给模板

    res.render('Index/Index', { title: 'Express', 'loggedIn': req.session.user.loggedIn });

    // in template            
    if (loggedIn) {
     <p>Logged in</p>
    } else {
     <p>Not logged in</p>
    }
    

    编辑 - 添加详细信息

    【讨论】:

    • 所以如果我有不同的 html dom 用于 login 和 logout ,那么我必须在 routes/index.js 中标记 html 然后传递给模板?
    • 感谢解释
    猜你喜欢
    • 2015-04-30
    • 2016-12-07
    • 1970-01-01
    • 2012-12-09
    • 2019-08-20
    • 2023-03-07
    • 1970-01-01
    • 2020-07-07
    • 2015-05-18
    相关资源
    最近更新 更多