Express + PostgreSQL 的最佳会话存储中间件
Best Session Storage Middleware for Express + PostgreSQL
我正在寻找生产应用程序的会话存储,因为我有错误消息:
Warning: connect.session() MemoryStore is not designed for a
production environment, as it will leak memory, and will not scale
past a single process
我的代码:
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;
我不知道什么是我的生产应用程序的最佳解决方案。我在 PostgreSQL 中使用 sequelize 作为 ORM。
如有任何意见,我将不胜感激。
如果你只想存储会话,你可以使用 redis 或者如果你想要持久性,可以使用 mongoDB。
我用 connect-pg-simple 得到了它。
使用提供的 table.sql 创建会话 table,并传入连接字符串或对象。
虽然已经接受了一个答案,但我认为更详细的答案是有序的,以便真正想要将 Express 与 PostgreSQL 一起用于一致会话存储的人可以有适当的参考。
Express 具有 session module 来处理会话,尽管它默认为 suitable 的内存存储,用于开发阶段,但不适用于生产阶段
Warning The default server-side session storage, MemoryStore, is purposely not designed for a production environment. It will leak memory under most conditions, does not scale past a single process, and is meant for debugging and developing.
因此对于 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 数据库的配置设置和 table 名称。
数据库连接设置应如下所示:
const sessionDBaccess = new sessionPool({
user: DB_USER,
password: DB_PASS,
host: DB_HOST,
port: DB_PORT,
database: DB_NAME})
另外注意会话池一定要启动:
const sessionPool = require('pg').Pool
我正在寻找生产应用程序的会话存储,因为我有错误消息:
Warning: connect.session() MemoryStore is not designed for a production environment, as it will leak memory, and will not scale past a single process
我的代码:
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;
我不知道什么是我的生产应用程序的最佳解决方案。我在 PostgreSQL 中使用 sequelize 作为 ORM。 如有任何意见,我将不胜感激。
如果你只想存储会话,你可以使用 redis 或者如果你想要持久性,可以使用 mongoDB。
我用 connect-pg-simple 得到了它。
使用提供的 table.sql 创建会话 table,并传入连接字符串或对象。
虽然已经接受了一个答案,但我认为更详细的答案是有序的,以便真正想要将 Express 与 PostgreSQL 一起用于一致会话存储的人可以有适当的参考。
Express 具有 session module 来处理会话,尽管它默认为 suitable 的内存存储,用于开发阶段,但不适用于生产阶段
Warning The default server-side session storage, MemoryStore, is purposely not designed for a production environment. It will leak memory under most conditions, does not scale past a single process, and is meant for debugging and developing.
因此对于 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 数据库的配置设置和 table 名称。
数据库连接设置应如下所示:
const sessionDBaccess = new sessionPool({
user: DB_USER,
password: DB_PASS,
host: DB_HOST,
port: DB_PORT,
database: DB_NAME})
另外注意会话池一定要启动:
const sessionPool = require('pg').Pool