Express + PostgreSQL的最佳会话存储中间件

时间:2015-04-08 04:55:37

标签: node.js postgresql express

我正在寻找生产应用的会话库,因为我有错误消息:

  

警告:connect.session()MemoryStore不是为a而设计的   生产环境,因为它会泄漏内存,而不会扩展   过去一个过程

我的代码:

var express              = require('express');
var ECT                  = require('ect');
var cookieParser         = require('cookie-parser');
var compress             = require('compression');
var session              = require('express-session');
var bodyParser           = require('body-parser');
var _                    = require('lodash');
var passport             = require('passport');
var expressValidator     = require('express-validator');
var connectAssets        = require('connect-assets');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(expressValidator());
app.use(methodOverride());
app.use(cookieParser());
app.use(session({
  resave: true,
  saveUninitialized: true,
  secret: secrets.sessionSecret,
}));
app.use(passport.initialize());
app.use(passport.session());

var app = module.exports = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(app.get('port'), function() {
  console.log('Express server listening on port %d in %s mode',  app.get('port'), app.get('env'));
});

module.exports = app;

我不知道什么是我的生产应用程序的最佳解决方案。我正在使用sequelize作为ORM和PostgreSQL。 我将非常感谢任何意见。

3 个答案:

答案 0 :(得分:5)

我使用了connect-pg-simple

使用提供的table.sql创建会话表,并传入连接字符串或对象。

答案 1 :(得分:1)

尽管已经接受了一个答案,但我认为还有一个更详尽的答案,以便真正希望将Express与PostgreSQL一起使用以进行一致的会话存储的人可以参考。

Express具有session module来处理会话,尽管它默认为适合于开发阶段但不适用于生产的内存中存储

  

警告默认的服务器端会话存储MemoryStore并非专门为生产环境设计。在大多数情况下,它将泄漏内存,不会扩展到单个进程,而是用于调试和开发。

因此对于PostgreSQL,有一个专用的简单连接器,名为connect pg simple

一旦您导入了connect-pg-simple即可。需要像这样将会话导入传递给它:

const session = require('express-session')
const pgSession = require('connect-pg-simple')(session)

将会话添加为中间件时,必须将其设置传递给它

app.use(session(sessionConfig))

并在sessionConfig中,在这里设置所有会话参数,您需要添加一个看起来像这样的存储选项(添加完整的选项集,尽管就目前而言,只需注意存储选项即可):

const sessionConfig = {
store: new pgSession({
    pool: sessionDBaccess,
    tableName: 'session'
}),
name: 'SID',
secret: randomString.generate({
    length: 14,
    charset: 'alphanumeric'
}),
resave: false,
saveUninitialized: true,
cookie: {
    maxAge: 1000 * 60 * 60 * 24 * 7,
    aameSite: true,
    secure: false // ENABLE ONLY ON HTTPS
}}

pgSesision的新实例具有两个选项,即用于访问PostgreSQL数据库的配置设置池和表名。

数据库连接设置应如下所示:

const sessionDBaccess = new sessionPool({
user: DB_USER,
password: DB_PASS,
host: DB_HOST,
port: DB_PORT,
database: DB_NAME})

还请注意,必须启动会话池:

const sessionPool = require('pg').Pool

答案 2 :(得分:-1)

如果你只是要存储会话,你可以使用redis或mongoDB,如果你想要持久性。