【问题标题】:Is there a way to access `req` object in the session function in express to use dynamic domains?有没有办法在快速访问会话函数中的“req”对象以使用动态域?
【发布时间】:2021-10-10 14:41:04
【问题描述】:

我想在我的路由中添加另一个域。所以多个域可以访问路由,我将能够检测请求来自哪个域并相应地处理它们。我想与动态域建立会话并使用 HTTPS。有什么方法可以在下面的 cookie 部分中使用动态域?我想用“mydomain2.com”替换下面的“mydomain.com”。任何访问req 对象的方法都在下面的session 方法中。

 server.use(session({
        secret: 'a;ldfnrlkf332',
        resave: true,
        store: new MongoStore({ mongooseConnection: mongoose.connection }),
        saveUninitialized: false,
        // cookie : {secure : false, domain : "lvh.me"}
        cookie: { 
            // secure: false, 
            secure : process.envNODE_ENV === "production" ? true :false,
            domain : process.envNODE_ENV === "production" ? "mydomain.com" :"localtest.me"
        }
    }));

该用户提出了类似的问题,但没有得到回复express-session dynamic cookie domain

如果我无法访问req 对象,还有哪些其他选择?我使用nginx,有什么我可以做的吗?也许我可以做动态环境变量。 我能想到解决这个问题的唯一方法是让多个节点应用程序文件(变得越来越大)在不同的路由上服务器。这样,我可以创建新的服务器块,根据服务器名称侦听不同服务器块上的不同路由。这一切只是为了改变像 20 个文本字符(域名)

【问题讨论】:

    标签: node.js express nginx server pm2


    【解决方案1】:

    根据您的信息,没有简约的工作示例,是否尝试过类似的方法?

     server.use((req, res, next) => {
    
        // do here what you want with req,res,next
    
        let middleware = session({
            secret: 'a;ldfnrlkf332',
            resave: true,
            store: new MongoStore({ mongooseConnection: mongoose.connection }),
            saveUninitialized: false,
            // cookie : {secure : false, domain : "lvh.me"}
            cookie: { 
                // secure: false, 
                secure : process.envNODE_ENV === "production" ? true :false,
                domain : process.envNODE_ENV === "production" ? "mydomain.com" :"localtest.me"
            }
        });
    
        // call middleware function
        middleware(req, res, next);
    
     });
    

    session 只返回一个中间件函数,您可以包装它。 https://github.com/expressjs/session/blob/master/index.js#L179

    编辑/注意:在每个请求上创建一个新的 mongodb 存储可能不是最好的做法。您应该在这里使用缓存/检查是否已经有缓存。

    遗憾的是,无法从外部访问 options 对象,这将允许操纵会话实例。

    Edit2,另一种方法是创建 n 个商店,尽可能多的域(使用您需要的选项),然后根据请求域调用所需的商店:

    app.use((req, res, next) => {
        switch (req.headers.host) {
    
            case "example.com":
                store1(req, res, next)
                break;
    
            case "sub.example.com":
                store2(req, res, next)
                break;
    
        }
    });
    

    【讨论】:

    • 感谢您的帮助,看来我的两个域都已启动。我想做更多的测试以确保会话正常工作。只是想说声谢谢并更新你。如果可以的话,我会对此表示赞同。
    • @jackblank 我很高兴能帮助你。这是否回答你的问题?如果是这样,请将我的解决方案标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 2023-04-10
    • 1970-01-01
    • 2021-10-30
    • 2010-09-27
    • 2018-11-08
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多