2015-12-13 2 views
0

моя проблема заключается в том, что мой сеанс не определен, как в новых слоях, даже после «if», где установлено значение сеанса.Nodejs express4 - неопределенный сеанс

/*******************************************/ 
/**/ var express   = require('express'), 
/**/  cookieParser = require('cookie-parser'), 
/**/  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: 'samurai' 
}); 

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(cookieParser()); 
app.use(session({ 
    secret: 'test session', 
    resave: false, 
    saveUninitialized: true 
})); 

var sess; 

Вот моя сессия неопределен (первое я иду в «/ знак» адрес):

app.get('/', function(req, res) { 
    sess = req.session; 
    console.log("sesja = "+sess.login); <--------------- undefined 

    if(sess.login) { 
    res.render('indexo'); 
    } else { 
    res.render('index'); 
    } 
}); 


app.post('/sign', function(req, res, next) { 
    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); <------------ works fine 
     } else { 
     console.log("The name or password is incorrect."); 
     } 
    }); 
    console.log(sess.login); <---------------- here again undefined 
    res.end(); 
}); 

Проблема только в сеансах случае, потому что если я создаю другую глобальную переменную рядом с «вар Sess;» (например, var test;) и установить для переменной значение в слове «if» в слове «/ sign», тогда «тест» будет виден в других слоях, а после этого «if».

окончательный вопрос: Почему session.login невидим после «if» и на другом уровне? Как правильно настроить его? У вас есть несколько советов для меня с созданием сессий?

Спасибо, ребята, за ваше время и помощь.

ответ

1

Установка глобальных переменных из HTTP-запроса - это злое дело и чревато проблемами. Во-первых, ваш сервер может одновременно иметь несколько запросов в полете от разных пользователей. Использование глобальных запросов от таких запросов означает, что разные запросы будут " топать "друг на друга глобальные и всевозможные хаосы и ошибки.

Прекратить использование глобальных данных для информации о сеансе. Если вам нужно передать информацию сессии другим функциям, передайте их им как аргументы функции.

И, во-вторых, вы ДОЛЖНЫ понять, как операции async работают в node.js, чтобы иметь возможность успешно программировать в node.js. Вы делаете несколько ошибок с вашим асинхронным программированием, и это одна из основных причин, почему переменные не установлены там, где вы думаете, что они должны быть.

В этом коде:

app.post('/sign', function(req, res, next) { 
    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); <------------ works fine 
     } else { 
     console.log("The name or password is incorrect."); 
     } 
    }); 
    // this is executed BEFORE the connection.query() callback is called 
    console.log(sess.login); <---------------- here again undefined 
    res.end(); 
}); 

connection.query() является асинхронным. Это означает, что он вызывает обратный вызов в будущем. Таким образом, ваш console.log(sess.login); в конце вашего запроса происходит до того, как обратный вызов когда-либо был вызван.

Вы не специфичны именно о том, что вы хотите, чтобы это произошло во всех случаях в запросе, но вот набросок того, как код может работать:

app.post('/sign', function(req, res, next) { 
    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); 
     res.end("Query error"); 
     } else if(rows.length > 0) { 
     res.end("Logged in successfully"); 
     } else { 
     res.end("The name or password is incorrect."); 
     } 
    }); 
}); 

Вы можете найти этот общий ответ на асинхронный Полезные ответы: How do I return the response from an asynchronous call?