【问题标题】:Nodejs express4 - undefined sessionNodejs express4 - 未定义的会话
【发布时间】:2015-12-13 18:26:41
【问题描述】:

我的问题是我的会话在新层中未定义,即使在设置会话值的“if”之后也是如此。

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

问题仅在会话情况下,因为如果我在“var sess;”旁边创建其他全局变量; (例如 var test;)并在“/sign”层的“if”中为变量设置一个值,然后“test”将在其他层和之后的“if”中可见。

最后一个问题:为什么 session.login 在“if”之后和其他层是不可见的?如何正确设置?你有一些关于创建会话的提示吗?

感谢你们的时间和帮助。

【问题讨论】:

    标签: javascript node.js session express


    【解决方案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?

    【讨论】:

      猜你喜欢
      • 2014-01-12
      • 2023-03-14
      • 2018-05-29
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2016-04-27
      • 2016-10-31
      相关资源
      最近更新 更多