J'utilise expressjs et hoganjs ci-dessous est mon package.json et ma configuration. Je me demande si je dois détecter une session et donner une mise en page différente à l'intérieur de Index.hjs seulement une partie.
Que devrais-je faire?

Je ne trouve aucun document sur la session dans hoganjs, il semble ne gérer que le modèle sans logique?
Cela signifie-t-il que je dois détecter dans routes/Index.js et rendre un fichier différent? Comment faire cet exemple?

Et si je dois faire en sorte que deux fichiers aient une partie en double, alors j'ai essayé de trouver un moyen comme étendre, inclure la méthode donc j'ai trouvé charger un autre fichier de modèle à l'intérieur du modèle mais cela ne semble pas pratique, alors je me demande généralement comment faire cela?

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;

Routes / 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;

Index.js

<!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>
0
user1775888 23 juil. 2015 à 13:49

2 réponses

Meilleure réponse

Je ne trouve aucun document sur la session dans hoganjs, il semble que gérer uniquement le modèle?

Hogan est un moteur de modèles. Il ne fait que traiter des modèles. Vous avez raison. (Voir: Qu'est-ce qu'un moteur de modèle? )

Cela signifie-t-il que je dois détecter dans routes / Index.js et rendre un fichier différent?

Non.

Ce que vous devez faire est de rendre un modèle mais dans ce modèle, afficher les éléments de menu conditionnellement :

{{#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}}

Dans Hogan, vous pouvez exprimer ce qui équivaut à une instruction if en utilisant la syntaxe ci-dessus. (Voir: Déclarations Hogan If .)

Vous avez besoin d'un moyen de transmettre l'instance user au modèle s'il y en a un. Vous pouvez le faire dans un gestionnaire d'itinéraire:

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

Ou dans le cas probable où vous souhaitez afficher le menu sur chaque page - probablement dans une mise en page - vous pouvez créer middleware:

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

Dans les exemples ci-dessus, j'utilise le middleware Passport. Vous allez devoir mettre en œuvre votre propre système d'identité et d'authentification, mais cela sort du cadre de cette question.

1
Community 23 mai 2017 à 11:51

Hogan ne gère pas la session. Express fait cela. Vous aurez besoin d'un magasin de session qui vous permettra de stocker les éléments que vous souhaitez dans l'objet req. En fonction de la valeur que vous stockez, vous pouvez transmettre la valeur au modèle et charger quoi que ce soit.

Magasin de session - https://github.com/expressjs/session

Dans Index.js

// définir la valeur

req.session.user.loggedIn = true;

// passer au modèle

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>
}

Modifier - détails ajoutés

1
Swaraj Giri 23 juil. 2015 à 11:06