我正在寻找生产应用的会话库,因为我有错误消息:
警告: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。 我将非常感谢任何意见。
答案 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,如果你想要持久性。