【问题标题】:NodeJS express-session (why undefined?)NodeJS express-session(为什么未定义?)
【发布时间】:2015-12-14 07:56:31
【问题描述】:

这是我的“登录”层:

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

但您知道,我只想在用户存在于数据库中的情况下创建会话。

简而言之问题: 如果我在“if”中创建会话,sess.login 仅在“/login”层中可见。与数据库的所有连接都已正确设置,一切正常。

感谢您的帮助。

【问题讨论】:

    标签: javascript node.js session express


    【解决方案1】:

    所以您的问题是您在回调外部调用res.end() 以进行查询。这实质上终止了响应过程,并且您没有机会更新 req.session 因为回调在响应过程结束后的短时间内(或更长)被调用。尝试将 res.end 放入回调中,我认为之后一切都会好起来的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 2017-11-16
      • 2014-04-24
      • 2020-08-08
      • 1970-01-01
      相关资源
      最近更新 更多