繁体   English   中英

Node.js Express4-未定义的会话

[英]Nodejs express4 - undefined session

我的问题是,即使在设置会话值的“ 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”之后和其他层中不可见? 如何正确设置? 您对创建会话有一些建议吗?

谢谢你们的时间和帮助。

从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()是异步的。 T'hat意味着它将在将来的某个时间调用其回调。 因此,您的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.");
      }
    });
});

您可能会发现有关异步响应的一般性回答很有用: 如何从异步调用返回响应?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM