Итак, я пытался внедрить аутентификацию пользователей для своего проекта, следуя видео-уроку "Web Dev Simplified" - https://youtu.be/-RCnNyD0L-s?t=1011
И я использовал точно такой же код как он (за исключением того, что я использовал mysql базу данных для хранения данных, в то время как он использовал массив). Весь код для регистрации пользователя работает нормально, но часть входа не работает. Весь код конфигурации паспорта записан в файле passport-config. js.
Проблема в том, что моя функция getUserById
в файле passport-config. js файл не возвращает пользователя, даже если он есть в результате, возвращенном функцией mysql.query()
(я могу это подтвердить потому что console.log(result[0])
в приложении. js фактически печатает объект пользователя). Когда я console.log(user)
в файле passport-config. js, он печатает undefined
.
Я думаю, что знаю, в чем проблема, но не знаю, как ее исправить. Как видно из фрагмента терминала (прилагается ниже), пользователь из passport-config. js печатается до того, как пользователь будет прочитан и возвращен в файл приложения. js.
Это мое приложение. js file:
const express = require("express");
const mysql = require('mysql');
const bodyparser = require('body-parser');
const bcrypt = require('bcryptjs');
const passport = require('passport');
const flash = require('express-flash');
const session = require('express-session');
const methodOverride = require('method-override');
const app = express();
const initializePassport = require('./passport-config')
initializePassport(
passport,
email_id =>{
mysqlConnection.query("SELECT * FROM user_tbl WHERE email_id= "+mysql.escape(email_id), (err, result, fields) => {
if (!err){
if(result.length==0)
return null;
else{
console.log(result[0]]);
return result[0];
}
}
else
console.log(err);
return null;
})
}
)
А это файл паспорта-конфигурации:
const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcryptjs')
function initialize(passport, getUserByEmail) {
const authenticateUser = async (email_id, password, done) => {
const user = getUserByEmail(email_id)
console.log("logging user:"+user) //"This prints undefined.WHYY?!?!?"
if (user == null) {
return done(null, false, { message: 'No user with that email' })
}
try {
if (await bcrypt.compare(password, user.password)) {
return done(null, user)
} else {
return done(null, false, { message: 'Password incorrect' })
}
} catch (e) {
return done(e)
}
}
passport.use(new LocalStrategy({ usernameField: 'email_id' }, authenticateUser))
passport.serializeUser((user, done) => done(null, user.email_id))
passport.deserializeUser((email_id, done) => {
return done(null, getUserByEmail(email_id))
})
}
module.exports = initialize
Это терминал после отправки формы входа в систему:
[nodemon] starting `node app.js`
Server has started on port 3010
Connection Established Successfully
logging user:undefined
RowDataPacket {
email_id: 'someuser@hotmail.com',
password: '$2a$05$Gvyn0CPZ0u8i93rZ9TTVPOvDYGlFbkaxiwIeUZIKmOgvspyWYjySC',
user_name: 'someuser',
mobile_no: 8377564281,
address: 'some address',
type_id: 3
}