Best Session Storage Middleware for Express + PostgreSQL

I got it working with connect-pg-simple.

Create a session table with the provided table.sql, and pass in a connection string or an object.


Though an answer has been accepted, I think a more elaborated answer is in order, so that people who actually want to use Express with PostgreSQL for consistent session storage can have a proper reference.

Express has the session module to handle the sessions though it defaults to in-memory storage that is suitable for development stages but not for production

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.

So for PostgreSQL there is a dedicated simple connector called connect pg simple

Once you import the connect-pg-simple you . need to pass it the session import like this:

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

When you add the session as middleware you'll have to pass it its settings

app.use(session(sessionConfig))

and in your sessionConfig, this would be where you set all your session parameters you need to add a store option that would look like this (adding the full set of options though for the matter at hand just note the store option):

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
}}

The new instance of pgSesision takes two options, the pool which is the config setup to access the PostgreSQL DB and the table name.

The DB connection setting should look like this:

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

Also note that the session pool must be initiated:

const sessionPool = require('pg').Pool