【问题标题】:Express: implementing MongoDB session storeExpress:实现 MongoDB 会话存储
【发布时间】:2020-01-23 05:45:00
【问题描述】:

目前,我要求并在index.js 顶部定义express-session 的选项,如下所示:

const session = require(`express-session`)({
    secret: `MyEpicSecret`,
    resave: true,
    saveUninitialized: true,
    cookie: {maxAge: 1000 * 60} // 1 minute: for testing
}),

我将它与我的快递应用程序一起使用:

app.use(session);

这个布局很重要,因为我后来将session 传递到index.js 底部的socket.io 模块:

require(`./modules/socket.js`)(server, session);


通过上述设计流程,我的应用程序可以正常运行,并且可以完美地处理和管理会话。我现在的目标是实现 connect-mongo 以将会话保存到 MongoDB。他们的documentation 有点模糊,但据我所知,我需要先要求express-session 模块,然后在app.use() 中定义稍后 使用的选项。这是一个问题 - 如果我在 app.use() 中定义选项,当我需要 socket.js 模块时,我将不再能够传递配置的会话(它是选项)。

我会喜欢做的事情是这样的:

const session = require('express-session')({
    secret: `MyEpicSecret`,
    resave: true,
    saveUninitialized: true,
    cookie: {maxAge: 1000 * 60}, // 1 minute: for testing
    store: new MongoStore(options)
});
const MongoStore = require('connect-mongo')(session);

app.use(session);

这是不可能的 - MongoStore 在我尝试使用它时没有定义。如果我将 MongoStore 向上移动,当我需要 MongoStore 时,session 将是未定义的。

我仍在学习 express 的技巧,非常感谢任何人能够提供的帮助 :)

【问题讨论】:

    标签: javascript node.js mongodb express session


    【解决方案1】:

    您仍然可以将session({...}) 调用的结果分配给一个变量并传递它。

    const expressSession = require('express-session');
    const MongoStore = require('connect-mongo')(expressSession);
    
    const session = expressSession({
        secret: `MyEpicSecret`,
        resave: true,
        saveUninitialized: true,
        cookie: {maxAge: 1000 * 60}, // 1 minute: for testing
        store: new MongoStore(options)
    });
    
    app.use(session);
    ...
    require(`./modules/socket.js`)(server, session);
    

    【讨论】:

    • 我对如何需要和使用这些特定模块的理解有点模糊。这对我有很大帮助。非常感谢您的帮助:)。
    【解决方案2】:

    试试这个:

     const session = require('express-session');
     const MongoStore = require('connect-mongo')(session);
    
     app.use(session({
        secret: `MyEpicSecret`,
        resave: true,
        saveUninitialized: true,
        cookie: {maxAge: 1000 * 60} // 1 minute: for testing
        store: new MongoStore(options)
     }));
    

    【讨论】:

    • 如原始问题中所述,通过使用此方法,当我在 index.js 的底部需要它时,我不会将 session 的选项对象传递给我的 socket.js 模块 - 这是为什么我必须在需要模块时定义我的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2020-12-15
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多