问题描述
我做了一个小项目,尝试使用express-session
,express-MysqL-session
,passport
,passport-local
来使用会话创建登录身份验证系统。
当我登录时,似乎没有任何问题。
但是当我使用MysqL workbence
选择会话表中的所有记录时,没有记录。
这是我的第一次,我不确定是否做错了什么。
这是git repo:
https://github.com/Coddielam/nodejs-express-session-mysql/blob/master/app.js
const express = require("express");
const MysqL = require("MysqL");
const session = require("express-session");
const MysqLStore = require("express-MysqL-session");
const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const bcrypt = require("bcrypt");
// get access to stuff stored in .env file
require("dotenv").config();
// init Express app
const app = express();
// Global middlewares for parsing request object
app.use(express.urlencoded({ extended: false }));
/****************************** MysqL connection ******************************/
// configuration
const databaseConfig = {
host: "localhost",user: process.env.DB_User,port: 3306,password: process.env.DB_Password,database: "Chirp",};
// Promisify database client
// tutorial: https://codeburst.io/node-js-MysqL-and-promises-4c3be599909b
class Database {
constructor(config) {
this.connection = MysqL.createConnection(
config,console.log("Database connected...")
);
}
query(sql,args) {
return new Promise((resolve,reject) => {
this.connection.query(sql,args,(err,rows) => {
if (err) return reject(err);
resolve(rows);
});
});
}
close() {
return new Promise((resolve,reject) => {
this.connection.end((err) => {
if (err) return reject(err);
resolve();
});
});
}
}
// creating a database instance with modified(promisified) query methods
// Connection created automatically upon instantiating
const Chirp = new Database(databaseConfig);
/****************************** Session Setup ******************************/
const sessionStore = new MysqLStore(
{
host: "localhost",createDatabaseTable: true,schema: {
tableName: "session",columnNames: {
session_id: "session_id",expires: "expires",data: "data",},Chirp
);
app.use(
session({
secret: process.env.SECRET,resave: false,saveUninitialized: false,store: sessionStore,})
);
/****************************** Passport ******************************/
const validPassport = (password,hash) => {
bcrypt(password,hash,result) => {
if (err) throw err;
return result;
});
};
const genPassword = (password) => {
return bcrypt.hash(password,10,hash) => hash);
};
passport.use(
"local",new LocalStrategy(
{
usernameField: "email",passwordField: "password",passReqToCallback: true,(req,email,password,done) => {
let user;
Chirp.query(`SELECT * FROM User_Login WHERE email='${email}'`)
.then((rows) => {
user = rows[0];
// no email
if (!rows.length) done(null,false);
// compare password returns a promise
return bcrypt.compare(password,rows[0].password);
})
.then((match) => {
if (match) {
done(null,user);
} else {
done(null,false);
}
})
.catch((err) => console.log(err));
}
)
);
passport.serializeUser(function (user,cb) {
cb(null,user.email);
});
passport.deserializeUser(function (id,cb) {
User.findById(id,function (err,user) {
if (err) {
return cb(err);
}
cb(null,user);
});
Chirp.query(`SELECT * FROM sessions WHERE session_id='${id}'`)
.then((rows) => cb(rows[0]))
.catch((err) => console.log(err));
});
app.use(passport.initialize());
app.use(passport.session());
/****************************** Routes ******************************/
app.get("/login",res,next) => {
const form =
'<h1>Login Page</h1><form method="POST" action="/login">\
Enter Email:<br><input type="email" name="email">\
<br>Enter Password:<br><input type="password" name="password">\
<br><br><input type="submit" value="Submit"></form>';
res.send(form);
});
app.post(
"/login",passport.authenticate("local",{
failureRedirect: "/login",successRedirect: "login-success",}),req,next) => {
if (err) throw err;
console.log("You're logged in.");
}
);
app.get("/login-success",res) => res.send("login success"));
const PORT = process.env.PORT || 5000;
app.listen(PORT,console.log(`Server listening on port ${PORT}...`));
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)