我的问题是我的会话未定义为新图层,即使在"如果"会话值设置的位置。
/*******************************************/
/**/ 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;在其他层?如何正确设置?有关会话创建的一些提示吗?
谢谢你们的时间和帮助。
答案 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?