Node.js 会话未使用express会话和connect会话续集持久化
我正在使用Sequilize库连接MySql数据库。一切正常。但是,每次重新加载浏览器时,会话都不会持久化。一个新的会话将以null userId存储在数据库中,有时甚至不止一个。我不知道为什么。我正在从express服务器上为我的VUESPA服务,它工作得非常好 我研究了StackOverflow,一些解决方案指向cors,但我只为VUE和Node使用一个端口,所以应该没有问题。我们将非常感谢您的帮助 下面是代码以及一些显示会话数据库中的行的图像 这是应用程序初始化的代码。 这是app.js文件的代码Node.js 会话未使用express会话和connect会话续集持久化,node.js,express,session,sequelize.js,session-cookies,Node.js,Express,Session,Sequelize.js,Session Cookies,我正在使用Sequilize库连接MySql数据库。一切正常。但是,每次重新加载浏览器时,会话都不会持久化。一个新的会话将以null userId存储在数据库中,有时甚至不止一个。我不知道为什么。我正在从express服务器上为我的VUESPA服务,它工作得非常好 我研究了StackOverflow,一些解决方案指向cors,但我只为VUE和Node使用一个端口,所以应该没有问题。我们将非常感谢您的帮助 下面是代码以及一些显示会话数据库中的行的图像 这是应用程序初始化的代码。 这是app.js文
我认为这是登录功能中的一个问题
const bodyParser = require('body-parser')
const cors = require('cors')
const cookieParser = require('cookie-parser')
const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth20')
const session = require('express-session')
// initalize sequelize with session store
var SequelizeStore = require("connect-session-sequelize")(session.Store);
const User = require("./models/User")
const Keys = require("./config/Keys")
const Db = require("./config/db")
module.exports = new class {
initialize(app) {
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser(Keys.secret));
// passport
/*
Stores information in the cookie when the user is created
*/
passport.serializeUser(function(user, cb) {
// console.log("this is the id which is getting used for serializing "+user.id);
cb(null, user.id);
});
/*
Extract information from cookie when logged in user sends the request
*/
passport.deserializeUser(function(id, done) {
User.findByPk(id)
.then(user => {
if(user) {
done(null, user);
} else {
done(null, null);
}
})
.catch(err=>{
done(null, null);
})
});
// Google OAuth
passport.use(
new GoogleStrategy({
clientID: Keys.google.client_id,
clientSecret: Keys.google.client_secret,
callbackURL: '/login/google/return'
}, (accessToken, refreshToken, profile, done) => {
User.findAll({where: {email: profile._json.email}})
.then(user => {
if(user.length > 0) {
done(null, user[0]);
} else {
User.create({
email: profile._json.email,
emailVerified: profile._json.email_verified,
roles: 'user'
})
.then(result=> {
done(null, result);
})
.catch(err => {
console.log("err");
console.log(err);
})
}
})
})
)
function extendDefaultFields(defaults, session) {
let r = {
data: defaults.data,
expires: defaults.expires
};
if(session.passport) {
if(session.passport.user) {
r.userId = session.passport.user;
}
}
return r;
}
var myStore = new SequelizeStore({
db: Db,
table: "Session",
extendDefaultFields: extendDefaultFields,
});
// configuring session
app.use(
session({
secret: Keys.secret,
store: myStore,
resave: false, // we support the touch method so per the express-session docs this should be set to false
proxy: false, // if you do SSL outside of node.
cookie: {secure: false}
})
);
app.use(passport.initialize());
app.use(passport.session());
}
}
require('dotenv').config();
const express = require('express')
const app = express()
let ejs = require('ejs');
const auth = require("./auth.js");
const siteConfig = require('./config/site.js');
const routes = require('./server-routes.js');
const db = require("./config/db.js")
async function ignite() {
try {
if (!process.env.MSG) {
throw new Error("\nEnvironment variables are not working.\n")
}
db.authenticate()
.then(() => console.log("connectedd"))
auth.initialize(app);
app.use('/', routes);
console.log("request going to vue app");
// Handle production
if(process.env.NODE_ENV === 'development') {
//static folder
app.use(express.static(__dirname + '/public'));
// handle SPA (Single Page Application)
app.get(/.*/, (req,res) => {
res.sendFile(__dirname + '/public/index.html');
})
}
app.listen(siteConfig.port, () => {
console.log(`ExamByPass server is running on ${ process.env.PORT || siteConfig.port }!`);
});
} catch (e) {
console.log("FATAL IGNITION ERROR", '\n', e);
}
}
ignite();