I am playing around with node/Express3.0. But I am not sure how to get session out. Especially I am not sure if I am doing right with the following in routes/session.js.
app.use(function(req, res, next) {
res.locals.session = req.session;
next();
});
The followings are more details.
I have this in app.js
var express = require('express')
, routes = require('./routes')
, http = require('http')
, path = require('path')
;
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('testtest'));
app.use(express.session({
secret: 'testtest',
maxAge: 3600000
}));
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
...
require ('./routes/session')(app);
...
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
And in routes/session.js
module.exports = function(app) {
app.use(function(req, res, next) {
res.locals.session = req.session;
next();
});
app.get('/session/new', function(req, res) {
res.render('session/new', {title: "Log in"});
});
app.post('/session', function(req, res) {
if (users[req.body.username] &&
users[req.body.username].password === req.body.password) {
req.session.user = users[req.body.username];
res.redirect('/users');
} else {
res.redirect('/session/new')
}
});
app.del('/session', function(req, res, next) {
req.session.destroy();
res.redirect('/users');
});
};
I have this in view.
- if (session.user) {
p
span Hello
span= session.user.name
span= session
span !
p
form(method="POST", action="/session")
input(type="hidden", name="_method", value="DELETE")
input(type="submit", value="Log out")
- } else {
p
a(href="/session/new") Login
span or
a(href="/users/new") Register
- }
But this does not pick up session and gives an error.
1| > 2| - if (session.user) { 3| 4| p 5| span Hello session is not defined
Thank you for your help in advance.
For the middleware approach to work, you need to make sure your app.use call that installs the middleware is done before your call to app.use(app.router);. Currently you're calling it after via the require('./routes/session')(app); call:
require ('./routes/session')(app);
app.use(app.router);
To do this without middleware, change your res.render call to pass in the local session variable you want available to the view:
app.get('/session/new', function(req, res) {
res.render('session/new', {title: "Log in", session: req.session});
});