2015-12-13 3 views
1

Это мой «войти» слой:NodeJS экспресс-сеанс (почему не определено?)

app.post('/sign', function(req, res) { 
sess=req.session; 

var query = 'SELECT * FROM ?? where ??=? AND ??=?'; 
var table = ["users", "name", req.body.login, "password", md5(req.body.password)]; 
query = mysql.format(query, table); 
connection.query(query, function(err, rows) { 
    if(err) { 
    console.log(err); 
    return; 
    } else if(rows.length > 0) { 
    console.log("You have been sucessfully logged in."); 
    sess.login = req.body.login; 
    console.log(sess.login); 
    } else { 
    console.log("The name or password is incorrect."); 
    } 
}); 
res.end(); 
}); 

Как вы видите, сессия должна быть создана, когда пользователь существует в базе данных (в самом деле, console.log (sess.login) показывает в консольном правильном содержании сеанса, так что сеанс был создан). Проблема в том, что я меняю слой.

app.get('/', function(req, res) { 
    sess = req.session; 
    if(sess.login) { 
    res.render('indexo'); 
    } else { 
    res.render('index'); 
    } 
    console.log(sess.login); 
}); 

Почему sess.login не определен здесь? Вот остальная часть моего кода (над слоями)

/*******************************************/ 
/**/ var express   = require('express'), 
/**/  session   = require('express-session'), 
/**/  bodyParser  = require('body-parser'), 
/**/  ejs    = require('ejs'), 
/**/  mysql   = require('mysql'), 
/**/  md5    = require('md5'); 
/*******************************************/ 

var app = express(); 
var connection = mysql.createConnection({ 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: 'simpledatabase' 
}); 

connection.connect(function(error) { 
    if(error) { 
    console.log("There is a problem with connection to the database."); 
    return; 
    } 
    console.log("Connected with a database."); 
}); 

app.use(session({ 
    secret: 'test session', 
    resave: false, 
    saveUninitialized: true 
})); 
app.use(express.static('public')); 
app.use('/js', express.static('bower_components/jquery/dist')); 
app.use(bodyParser.json()); 
app.set('view engine', 'ejs'); 
app.set('views', 'public/views'); 

var sess; 

sess.login видна, когда я создаю его, например, таким образом:

app.post('/sign', function(req, res) { 
sess=req.session; 
sess.login = req.body.login; /****** HERE ******/ 
var query = 'SELECT * FROM ?? where ??=? AND ??=?'; 
var table = ["users", "name", req.body.login, "password", md5(req.body.password)]; 
query = mysql.format(query, table); 
connection.query(query, function(err, rows) { 
    if(err) { 
    console.log(err); 
    return; 
    } else if(rows.length > 0) { 
    console.log("You have been sucessfully logged in."); 
    } else { 
    console.log("The name or password is incorrect."); 
    } 
}); 
res.end(); 
}); 

Но вы знаете об этом I хотите создать сеанс только в том случае, если пользователь существует в базе данных.

Короче говоря: sess.login отображается только в слое '/ login', если я создаю сеанс в 'if'. Все соединения с базой данных правильно настроены, все отлично работает с этим.

Благодарим за помощь.

ответ

0

Итак, ваша проблема заключается в том, что вы вызываете res.end() снаружи своего обратного вызова для вашего запроса. Это существенно прекращает процесс ответа, и вы не получаете возможности обновлять req.session, потому что callback получает короткое время (или больше) после завершения процесса ответа. Попробуйте поставить res.end в обратном вызове, и я думаю, что после этого все будет работать.

Смежные вопросы