NodeJS在第二个用户会话后显示不同的MySQL结果

我是NodeJS和Express的新手,并且遇到了一些我自己无法解决的小问题。 我一直在努力自己修改这些代码,但是我所有的努力都是毫无意义的。

基本上我正在寻找使简单的networking应用程序,它支持用户login,并显示login用户(用户configuration文件)相关的数据。 这就是我自己做的事。 有点。 在启动应用程序后,为用户显示“user1”login和数据,但是在其他浏览器中以不同的用户(user2)login后,两个用户会话显示的数据库结果相同(结果来自第二个用户 – “user2 “)。 我即将实施密码密码今天,但这让我卡住了。 这是我的代码:

app.js

var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var session = require('express-session'); var user = require('./users.model.js'); var data = {} app.use(bodyParser()); app.use(session({ secret: 's00p3rc001', resave: true, saveUninitialized: true })) app.set('view engine', 'ejs'); app.get('/', function(req, res){ res.send('It works!') }) app.get('/login', function(req, res, next){ console.log('SID BEFORE LOGIN: ' + req.session.id) res.render('login') next(); }) app.post('/login', function(req, res){ user.checkLoginAndInsertSession(req.body.email, req.body.password, req.session.id, function(result){ if(result == true){ req.session.loggedIn = true; req.session.uniqueSID = req.session.id; user.getBySession(req.session.uniqueSID, function(result){ data.fromDB = result; res.redirect('/profile') }) } else { res.send('Failed login!') } }) }) app.get('/profile', function(req, res){ if(req.session.loggedIn){ console.log('SID AFTER LOGIN: ' + req.session.uniqueSID) console.log(data.fromDB) res.send(data.fromDB) } }) app.listen(3001); 

db.js

 var config = require('./dbconfig'); module.exports = require('mysql').createPool(config); 

dbconfig.js

 module.exports = { connectionLimit: 10, waitForConnections: true, acquireTimeout: 30000, host: 'localhost', user: 'dbuser', password: 'dbpass', database: 'mydb' } 

users.model.js

 var db = require('./db'); exports.checkLoginAndInsertSession = function(email, password, session, result){ db.getConnection(function(err, connection){ if(err) throw err; db.query('SELECT email, password FROM users WHERE email="'+email+'"', function(err, rows){ if(err) throw err; if(email == rows[0].email && password == rows[0].password){ db.query('UPDATE users SET session="'+session+'" WHERE email="'+rows[0].email+'"', function(err, rows){ connection.release(); result(true) }) } else { result(false) } }) }) } exports.getBySession = function(session, result){ db.getConnection(function(err, connection){ if(err) throw err; db.query('SELECT * FROM users WHERE session="'+session+'"', function(err, rows){ connection.release(); if(err) throw err; result(rows); }) }) } 

login.ejs

 ... <form action="/login" method="post"> <input type="text" name="email" label="Email:"></input> <input type="password" name="password" label="Password:"></input> <input type="submit" name="submit" lable="Log in"></input> </form> ... 

这是我的表架构

 +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | userid | int(11) | NO | PRI | NULL | auto_increment | | firstname | varchar(45) | NO | | NULL | | | lastname | varchar(45) | NO | | NULL | | | email | varchar(45) | NO | UNI | NULL | | | password | varchar(45) | NO | | NULL | | | session | varchar(45) | YES | UNI | NULL | | +-----------+-------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec) 

如果你能在这里指出我的错误,我会很感激。

login后,您使用res.redirect('/profile') 。 这告诉浏览器在/profile路由上对服务器进行新的呼叫。 发生这种情况时,您正在提供data.fromDB 。 您希望它包含以前login的数据 – 但是,如果用户2在用户1login和redirect之间login, data.fromDB将用用户2的数据更新。 此时,来自用户1的redirect已完成, data.fromDB包含用户2的数据,而不是用户1的数据。 这不一定是在这里发生的事情,但我会记住这一点,并避免这种架构。 我认为你应该把你的getBySession()函数移动到/profilepath,以确保session id是被查询的那个。

避免将用户数据存储在data.fromDB ,因为它是全局的,并且可能会被错误地服务。