问题描述
我正在使用 TypeScript。
我想将会话存储到 mongoDB 中。不在内存中。 我阅读了文档,但我无法弄清楚。 (https://github.com/SerayaEryn/fastify-session)
我应该怎么做才能将会话存储到 mongoDB 中?
编写访问 mongoDB 并使用 sessionId 插入记录的 set 方法? 获取和销毁也是如此
我写的。对我来说似乎效果很好。有什么问题吗?
import fastifySession from 'fastify-session';
import mongoose from 'mongoose';
import Session from './schemas/sessionSchema';
mongoose.set('useNewUrlParser',true);
mongoose.set('useUnifiedTopology',true);
mongoose.set('useFindAndModify',false);
mongoose.set('useCreateIndex',true);
class Database {
constructor() {
this.connect();
this.sessionStore = new SessionStore();
}
sessionStore: fastifySession.SessionStore;
connect() {
mongoose.connect('mongodb://127.0.0.1:27017/mydb')
.then(() => {
console.log('Database conneciton successful');
})
.catch((err) => {
console.log(`Database connection error ${err}`)
})
}
}
class SessionStore implements fastifySession.SessionStore {
set(sessionId: string,session: any,callback: (err?: Error) => void) {
console.log('set');
Session.findOneAndUpdate({ _id: sessionId },{ _id: sessionId,session: JSON.stringify(session) },{ upsert: true })
.then(() => {
callback();
})
.catch(callback);
}
get(sessionId: string,callback: (err?: Error,session?: any) => void) {
console.log('get');
Session.findOne({ _id: sessionId })
.then((result) => {
if (result) {
callback(undefined,JSON.parse(result.session));
} else {
callback();
}
})
.catch(callback);
}
destroy(sessionId: string,callback: (err?: Error) => void) {
console.log('destroy');
Session.findOneAndDelete({ _id: sessionId })
.then(() => { callback(); })
.catch(callback);
}
}
export default new Database();
import mongoose from 'mongoose';
const Schema = mongoose.Schema;
const sessionSchema = new Schema(
{
_id: { type: String },expires: { type: Date },session: { type: String }
}
);
const session = mongoose.model<ISessionDocument>('Session',sessionSchema);
interface ISessionDocument extends mongoose.Document {
_id: string,expires: Date,session: string
}
export default session;
import fastify from 'fastify';
import fastifyCookie from 'fastify-cookie';
import fastifySession from 'fastify-session';
import database from './database';
const PORT = 8080;
const app = fastify();
app.register(fastifyCookie);
app.register(fastifySession,{
secret: 'mysecretmysecretmysecretmysecret',cookie: { secure: false },// false for develop on HTTP.
store: database.sessionStore
});
app.get('/' async (req) => {
return `hello`;
});
app.listen(PORT,(err,address) => {
if (err) {
console.error(err);
process.exit(1);
}
console.log(`Server listening at ${address}`);
});
解决方法
您是否尝试过使用“connect-monogo”?使用 connect-monogo 包,您可以配置 fastify-session 的 store 选项:
app.register(fastifySession,{
cookieName: 'YOUR_SESSION_COOKIE_NAME',secret: 'YOUR_SESSION_SECRET",saveUninitialized: false,cookie: {
path: '/',secure: process.env.NODE_ENV === 'production',maxAge: MAX_SESSION_AGE,},store: new MongoStore({
mongoUrl: 'YOUR_MONGODB_URL',}),});