问题描述
尽管使用了 connect-mongo,Express-session 似乎没有持续。
(mongoDB,mongoose,express-session,connect-mongo)
我认为这是 cors 问题,因为它似乎一直存在于 Postman 上,并添加了以下代码而没有更改/修复。
app.use(cors({credentials:true,origin: 'http://localhost:3000'}));
有人知道这里的问题吗? 这是 cors 问题还是 connect-mongo 配置问题?
import cors from 'cors';
import dotenv from 'dotenv';
import express from 'express';
import mongoose from 'mongoose';
import inProgress from './routes/progress';
import Auth from './routes/auth';
import session from 'express-session';
import MongoStore from 'connect-mongo';
dotenv.config();
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(cors({credentials:true,origin: 'http://localhost:3000'}));
const port = 5000;
app.use(express.json());
// tslint:disable-next-line: only-arrow-functions
const uri = process.env.ATLAS_URI;
mongoose.connect(uri,{ useNewUrlParser: true,useUnifiedTopology: true });
const connection = mongoose.connection;
connection.once('open',() => {
console.log('MongoDB Atlas connection established');
});
app.use(
session({
secret: 'secret123',store: new MongoStore({
mongoUrl: uri,ttl: 14 * 24 * 60 * 60,}),resave: false,saveUninitialized: true,cookie: {
httpOnly: false,secure: false,maxAge: 60000,},})
);
app.use('/progress',inProgress);
app.use('/auth',Auth);
app.listen(port,() => {
console.log(`Server is running on PORT ${port}`);
console.log(process.env.ATLAS_URI);
});
model.ts
import mongoose,{ Schema,Document,Model } from 'mongoose';
import bcrypt from 'bcrypt';
interface IUser extends Document {
username: string;
password: string;
}
interface Iusermodel extends Model<IUser> {
findUser(username: string,password: string): any;
}
const userSchema = new mongoose.Schema<IUser>({
username: {
type: String,unique: true,required: true,password: {
type: String,});
// tslint:disable-next-line: only-arrow-functions
userSchema.statics.findUser = async function (username,password) {
const user = await User.findOne({ username });
if (!user) {
return;
}
const isMatch = await bcrypt.compare(password,user.password);
if (!isMatch) {
return;
}
return user;
};
userSchema.pre<IUser>('save',async function (next) {
const user = this;
if (user.isModified('password')) {
user.password = await bcrypt.hash(user.password,8);
}
next();
});
const User: Iusermodel = mongoose.model<IUser,Iusermodel>('User',userSchema);
export default User;
route.ts
import express,{ response } from 'express';
import User from '../models/user-model';
const router = express.Router();
declare module 'express-session' {
// tslint:disable-next-line: interface-name
export interface SessionData {
user: { [key: string]: any };
}
}
router.post('/signin',async (req,res) => {
const { username,password } = req.body;
const user = await User.findUser(username,password);
if (user) {
req.session.user = user._id;
res.json({
message: 'You were successfully able to login',auth: true,});
} else {
res.json({
message: 'Unable to login',auth: false,});
}
});
router.post('/signup',(req,res) => {
const user = new User(req.body);
req.session.user = user._id;
user
.save()
.then((result) => {
res.json({
message: 'Successfully created',});
})
.catch((err) => {
res.json({
message: 'Unable to create account',});
});
});
router.get('/checkauth',res) => {
if (req.session.user) {
res.json({
auth: true,message: 'You are signed in',});
}
return res.json({
auth: false,message: 'Sign in please.',});
});
export = router;
router.post('/logout',res) => {
if (req.session.user) {
// tslint:disable-next-line: only-arrow-functions
req.session.destroy(function(err) {
console.log(err);
});
res.clearCookie('connect.sid');
return res.json({ msg: 'logging you out' });
} else {
return res.json({ msg: 'no user to log out!' });
}
});
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)