【问题标题】:Warning: connect.session() MemoryStore is not designed for a production environment, as it will leak memory, and will not scale past a single process警告:connect.session() MemoryStore 不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程
【发布时间】:2017-12-06 13:02:16
【问题描述】:

大家好,这是我的代码:

var express = require('express');
var session = require('express-session');

var app = express();
app.set('trust proxy', 1);

app.use(session({
secret: 'secret',
saveUninitialized: true,
resave: false,
maxAge: 1000 * 60 * 15,
cookie:{
    secure: true
       }
}));

此代码总是在我的日志中返回:

警告:connect.session() MemoryStore 不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程。

我尝试用谷歌搜索它,但我似乎不理解一些教程。 对不起我的英语不好。

【问题讨论】:

    标签: javascript node.js session cookies memory-leaks


    【解决方案1】:

    使用cookie-session 而不是express-session 为我解决了这个问题。

    您将会话存储在客户端上,而不是使用 cookie 存储在服务器上。

    简单地说:

    1. 用npm install cookie-session安装它
    2. 更改

      var session = require('express-session');

      致var session = require('cookie-session');

    【讨论】:

      【解决方案2】:

      这都是关于存储会话的,您应该添加一个将会话存储到数据库中的存储系统。这有助于您的应用管理会话。

      例如在mongodb中你可以使用connect-mongo,你应该找到一个store包和其他数据库。

      https://www.npmjs.com/package/connect-mongo

      const session = require('express-session');
      const MongoStore = require('connect-mongo')(session);
      
      app.use(session({
          secret: 'foo',
          store: new MongoStore(options)
      }));
      

      【讨论】:

      【解决方案3】:

      我希望这对和我遇到同样问题的人有所帮助。 自己挖的就行了。

      //-momery unleaked---------
      app.set('trust proxy', 1);
      
      app.use(session({
      cookie:{
          secure: true,
          maxAge:60000
             },
      store: new RedisStore(),
      secret: 'secret',
      saveUninitialized: true,
      resave: false
      }));
      
      app.use(function(req,res,next){
      if(!req.session){
          return next(new Error('Oh no')) //handle error
      }
      next() //otherwise continue
      });
      

      【讨论】:

      • 如果你稍微解释一下会更有帮助!......因为你使用RedisStore(),Mongodb呢??
      • 问题在于将会话数据存储在内存中并不安全。它没有以任何方式加密或保护。此外,每次重新启动服务器时,所有会话数据都将消失,用户将不得不再次登录。此外,您将来无法扩展您的应用程序,因为会话数据存储在本地内存中,并且无法被远程运行或在同一主机上作为单独进程运行的应用程序的其他实例访问使用外部会话存储有助于解决这些问题。 Redis 是一个可以做到这一点的数据库。 MongoDB 也可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2010-09-25
      • 1970-01-01
      • 2012-04-10
      • 2011-01-17
      • 2015-03-11
      • 1970-01-01
      相关资源
      最近更新 更多