如何在 fastify-session 上编写 set/get/destroy 方法以将会话存储到 MongoDB?

问题描述

我正在使用 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',}),});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...