为什么express-mysql-session写入数据库,但不知何故不从它读取?



我有一个用ECMA语法编写的nodejs应用程序,有一个依赖项。MJS和index.js。我认为我已经得到了express-mysql-session和express-session设置正确,因为我在之前的commonJS项目中得到了它,但是这种奇怪的行为正在做我的头。

index.js中的相关代码:

'use strict';
import dotenv from 'dotenv';
dotenv.config();
import dependencies from "./dependencies.mjs";
const { DateTime, express, connectToDb, cors, mysql2 } = dependencies;
import session from "express-session";
import MySQLStore from "express-mysql-session";
const sessconn = mysql2.createPool({
host: process.env.SESSION_DB_HOST,
user: process.env.SESSION_DB_USER,
password: process.env.SESSION_DB_PASSWORD,
database: process.env.SESSION_DB_NAME,
socketPath: process.env.SOCKET_PATH,
connectionLimit: 1,
});
const sessionStore = new (MySQLStore(session))({
clearExpired: true,
expiration: 86400000,
checkExpirationInterval: 3600000,
createDatabaseTable: true,
}, 
sessconn);

connectToDb().then(()=>{
console.log('connected to db!!');
}
).catch((err)=>{
return res.status(500).send({msg: 'Error connecting to database', err: err.message})
})
const app = express();
app.use(express.json({ limit: '300kb' }))
app.use(cors({
origin: process.env.WEBSITE_DOMAIN,
allowedHeaders: ["content-type", "authorization"],
credentials: true,
}));
app.use(session({
name: 'session_name',
store: sessionStore,
secret: process.env.SESSION_SECRET,
saveUninitialized: false,
resave: false,
cookie: {
sameSite: 'none',
secure: false
maxAge: +process.env.COOKIE_MAXAGE,
httpOnly: true,
}
}));
app.use(express.static('public'));
import { router as authRoutes } from './routes/auth.mjs';
app.use('/auth', authRoutes)
// auth middleware / login wall
app.use((req,res,next) => {
if (req.session.user) {
let expiry = DateTime.now().plus({hours: 1}).toISO();
req.session.user.expiry = expiry;
next();
} else {
res.status(403).send({ msg: "You must be logged in to access this resource."});
}
})
app.listen(port, () => console.log(`Its alive on port ${port}!`))

和my dependencies.mjs

"use strict";
import dotenv from 'dotenv';
dotenv.config();
import express from 'express';
import cors from 'cors';
import { DateTime, Settings } from 'luxon';
Settings.defaultZone = "Australia/Brisbane";
import validation from 'express-validator';
const { body, validationResult, param, check } = validation;
import mysql2 from 'mysql2/promise';
const dbconn = await mysql2.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
socketPath: process.env.SOCKET_PATH,
});
async function connectToDb() {
try {
await dbconn.connect()
} catch (err) {
return err
}
}
import bcrypt from 'bcrypt'
import crypto from 'crypto'
import sgMail from '@sendgrid/mail';
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
export default { 
DateTime, 
Settings, 
express, 
body,
check,
param,
validationResult, 
dbconn, 
bcrypt, 
crypto, 
sgMail, 
cors,
connectToDb,
mysql2
};

我有一个认证路由,在那里我设置会话一旦用户登录:

if(req.session.user){
return res.status(200).send({msg: "Logged in already.", user: req.session.user});
} else {
const expireTime = DateTime.now().plus({hours: 1}).toISO();
req.session.cookie.user = {
id: user_object.id,
email: req.body.username,
name: `${first} ${last}`,
expiry: expireTime
}
return res.status(200).send({msg: "Session created", user: req.session.user});
} 

将一条记录保存在正确的数据库中正确的表中。记录看起来是正确的,我只是通过终端访问mysql来检查它是否在那里。

然而,当我调用登录墙下面的路由时,它返回的会话与我写到数据库的会话不同。我不知道为什么,我已经尽了最大的努力来实现这个。任何帮助将非常感激!

(ChatGPT,上帝保佑它,也帮不上什么忙,我在谷歌上也没能找到类似的问题)。

捂脸的瞬间,但值得分享。

基本上后端一切都很好。我已经改变了一些东西自从张贴,但我相信这将是工作尽管如此。

我没有发送带有"凭据"的api调用;我没有发送cookie。这导致每次调用都创建一个新会话。

Using "withCredentials: true;在API调用中解决了这个问题。

最新更新