[英]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.