2015-07-23 1 views
0

Я использую expressjs и hoganjs ниже, мой package.json и настройки. У меня вопрос, должен ли я обнаруживать сеанс и давать разную компоновку внутри Index.hjs только часть.
Что мне делать?express + hogan как обрабатывать сеанс?

Я не могу найти какой-либо документ о сеансе в 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; 

Index.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> 

ответ

1

Я не могу найти какой-либо документ о сессии в hoganjs, кажется, только ручка шаблон?

Hogan - шаблон двигателя. Все, что он делает, это шаблоны процессов. Вы правы. (См.: what is a template engine?)

Это значит, что я должен обнаруживать в маршрутах/Index.js и отображать разные файлы?

Nope.

Что вы должны сделать, это, делают один шаблон, но в этом шаблоне, показывают пункты меню условно:

{{#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. Вам понадобится реализовать свою собственную систему идентификации и аутентификации, но это выходит за рамки этого вопроса.

+0

Благодарим за объяснение !! – user1775888

+1

Нет проблем. Если он ответил на ваш вопрос, пожалуйста, подумайте о том, чтобы отметить его как принятый ответ. Спасибо! –

+0

@ пользователь1775888 Спасибо: 3. –

1

Hogan не обрабатывает сеанс. Экспресс делает это. Вам понадобится хранилище сеансов, которое позволит вам хранить нужный материал в объекте req. Основываясь на сохраненном вами значении, вы можете передать значение шаблону и загрузить его.

магазин Session - 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> 
} 

Редактировать - добавлены детали

+0

поэтому, если у меня есть другой html dom для входа и выхода из системы, то мне нужно пометить html в 'routes/index.js', а затем перейти к шаблону? – user1775888

+1

Обновлен ответ. –

+0

Благодарим за объяснение – user1775888