2016-03-29 1 views
1

Я довольно новичок в NodeJS и Express, и я застрял в какой-то, вероятно, тривиальной проблеме, которую я не могу решить самостоятельно. Я пытался сам исправить этот код, но все мои усилия были бессмысленными.NodeJS показывает разные результаты MySQL после второго сеанса пользователя

В основном я ищу, чтобы сделать простое веб-приложение, которое поддерживает логины пользователей и показывает данные, связанные с зарегистрированным пользователем (профиль пользователя). И это то, что мне удалось сделать самостоятельно. Вроде. После запуска приложения, пользовательский журнал «user1» и данные отображаются для указанного пользователя, однако после входа в систему как другой пользователь (user2) в другом браузере оба пользовательских сеанса показывают одинаковые результаты базы данных (результаты получены от второго пользователя - «user2» «). Сегодня я собирался внедрить bcrypt для паролей, но это заставило меня застрять. Вот мой код:

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) 

Я был бы очень признателен, если вы могли бы указать на мою ошибку Вот.

+0

Не для nitpick ... но вы храните пароли в ящике базы данных? 'password == rows [0] .password' - это не-нет. Сохранить хэш (возможно, используя, по крайней мере, bcrypt) - сравнить 'hashUserSent (password) == rows [0] .password' – noderman

+0

В настоящее время - да, но, как я уже сказал, я собирался реализовать bcrypt сегодня, но проблема этого сеанса заставила меня застрял без прогресса. Это на моей локальной машине, и это всего лишь учебное приложение. – MerkisL

+0

Извините, я просмотрел вопрос и не видел его. – noderman

ответ

1

После авторизации, используйте res.redirect('/profile'). Это говорит браузеру сделать новый звонок на сервер по маршруту /profile. Когда это произойдет, вы подаете data.fromDB. Вы ожидаете, что он будет содержать данные из предыдущего входа - однако, если пользователь 2 регистрируется между логином пользователя 1 и перенаправлением, data.fromDB будет обновляться данными пользователя 2. На данный момент перенаправление от пользователя 1 завершено, и data.fromDB содержит данные пользователя 2, а не пользователь 1. Это не обязательно то, что здесь происходит, но я хотел бы иметь это в виду и избегать этой архитектуры. Я думаю, вы должны переместить функцию getBySession() на маршрут /profile, чтобы убедиться, что идентификатор сеанса задан.

И избегайте хранения пользовательских данных на data.fromDB, так как он является глобальным для процесса и может быть подан некорректно.

+0

Эй, нудерман, спасибо за ответ. Это более или менее то, что я на самом деле сделал прошлой ночью перед сном, но я слишком устал, чтобы обновляться. Вот мой конечный результат, который работает так, как должен. http://pastebin.com/hBDa36Fr Еще раз спасибо за помощь! – MerkisL

+0

Рад это слышать. Я все еще немного расстроен тем, что было не так в исходном коде - единственное, что я мог видеть, это глобальная переменная, получающая старые данные ... Приветствия. – noderman

+0

По какой-то причине последний вход в систему будет переопределять идентификатор сеанса в базе данных для всех остальных пользователей с собственным. Я все еще не уверен, почему. У меня есть старый прослушиваемый код на git, и я буду тестировать его сегодня/завтра с проверкой узла. Если мне удастся определить проблему, будучи тем, что я новичок в NodeJS и JS в целом, я с радостью опубликую обновление, почему исходный код не работал должным образом. – MerkisL

Смежные вопросы