Nodejs express4 - 未定义的会话

时间:2015-12-13 18:26:42

标签: javascript node.js session express

我的问题是我的会话未定义为新图层,即使在"如果"会话值设置的位置。

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

此处我的会话未定义(首先我转到' / sign'地址):

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();
});

问题仅出现在会话案例中,因为如果我在&#34; var sess;&#34;旁边创建其他全局变量(例如var test;)并为变量设置一个值&#34; if&#34; in&#39; / sign&#34;层,然后&#34;测试&#34;将在其他层中可见,然后在#34;如果&#34;。

最后一个问题:为什么session.login在&#34之后是不可见的;如果&#34;在其他层?如何正确设置?有关会话创建的一些提示吗?

谢谢你们的时间和帮助。

1 个答案:

答案 0 :(得分:1)

从http请求设置全局变量是一件坏事,并且充满了问题。首先,您的服务器可以同时从不同的用户处获得多个请求。使用像这样的请求中的全局变量意味着不同的请求将“踩踏”彼此的全局变量,并且随之而来的是各种混乱和错误。

完全停止使用全局变量来获取会话信息。如果需要将会话信息传递给其他函数,则将其作为函数参数传递给它们。

其次,您必须了解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?