保持护照会话在服务器重新启动期间保持活动状态

9

有没有办法在服务器重新启动时保持用户会话,以帮助保持我的开发速度?

我正在本地机器上开发ExpressJS节点项目。我使用Grunt-nodemon监视我的JS文件,并在进行更改后重新启动服务器。但这意味着我的项目中的任何会话(有一个用户登录)都将被清除。

目前,如果我在某个深层页面中并重新启动,我将被踢出到登录页面,并必须重新导航,这真的很令人沮丧。

我正在使用passport作为会话中间件。我正在使用mongoose作为我的主要应用程序数据存储,如果可以以某种方式使用它就太好了。


使用redis等其他存储作为会话存储,而不是默认的内存存储。但是,除非您正在使用会话进行一些非常高级的操作,否则我建议使用基于cookie的会话。 - sarveshseri
会话仍然基于cookie,只是在服务器重新启动后无效。Redis不是数据库解决方案吗? - Alex
1
请勿使用MemoryStore,同时确保您使用的sessionSecret在服务器重新启动时不会更改(我曾遇到过这个问题);如果sessionSecret发生变化,express将无法从数据库/所选的sessionStore中恢复您的数据。 - Renato Gama
1个回答

8

只需使用任何存储方法即可实现。

其中一种选择是使用Redis。

以下是使用 connect-redis 模块的示例:

    app.use(express.cookieParser());
    var session = require('express-session');
    var RedisStore = require('connect-redis')(session);
    app.use(express.session(
        {
            store: new RedisStore(
                {
                    host: '127.0.0.1',       //where redis store is
                    port: 6379,              //default redis port
                    prefix: 'sess',          //prefix for sessions name is store
                    pass: 'passwordtoredis'  //password to redis db
                }
            ),
            secret: 'cookiesecret',        //cookie secret
            key: 'express.sid'
        }

));

虽然可以更简洁,但它应该运行良好。

设置Redis非常容易; Redis网页有一个很好的教程:http://redis.io/topics/quickstart

请记住,默认情况下,Redis将会把 session 存储在内存中,这意味着如果您重新启动硬件,则会丢失session(但有一种选项可以使其持久化http://redis.io/topics/persistence

希望这可以帮助到您:)


谢谢你的回答。那么你认为我可以使用当前的mongoose配置来存储会话吗? - Alex
是的。而且有为此目的而设计的实用程序(类似于redis connect)可以做到这一点,正如 https://dev59.com/YmYq5IYBdhLWcg3w8lNo 所述,connect-mongo看起来是最好的包。 这是链接:https://github.com/kcbanner/connect-mongo 。当然,您可以明确地使用mongoose并编写自己的存储器 :)。 - Jarema
1
太棒了。我升级到Express 4.x并使用connect-mongo。完美地运行,并为我节省了很多时间。再次感谢,继续保持 :) - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接