Skip to content

Commit e0d2b05

Browse files
Demo PostgreSQL session store
1 parent aafc174 commit e0d2b05

6 files changed

Lines changed: 255 additions & 3 deletions

File tree

package-lock.json

Lines changed: 189 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,14 @@
6060
"@eslint/markdown": "^7.5.1",
6161
"@types/body-parser": "^1.19.6",
6262
"@types/browser-sync": "^2.29.1",
63+
"@types/connect-pg-simple": "^7.0.3",
6364
"@types/cookie-parser": "^1.4.10",
6465
"@types/cookie-session": "^2.0.49",
6566
"@types/express": "^5.0.6",
6667
"@types/express-flash": "^0.0.5",
6768
"@types/express-session": "^1.18.2",
6869
"@types/nunjucks": "^3.2.6",
70+
"@types/pg": "^8.16.0",
6971
"@types/portscanner": "^2.1.4",
7072
"@types/wait-on": "^5.3.4",
7173
"eslint": "^9.39.2",

testapp/.env

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
POSTGRES_DB=sessions
2+
POSTGRES_PASSWORD=not-a-secret
3+
POSTGRES_URL=postgres://postgres:not-a-secret@localhost:5432/sessions

testapp/app/session.js

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
import connectPgSimple from 'connect-pg-simple'
12
import cookieSession from 'cookie-session'
3+
import expressSession from 'express-session'
4+
import { Pool } from 'pg'
25

36
import * as config from './config.js'
47

8+
const { POSTGRES_URL, NODE_ENV } = process.env
9+
510
/**
611
* Cookie session store
712
*/
@@ -13,4 +18,32 @@ function getCookieSession() {
1318
})
1419
}
1520

16-
export const session = getCookieSession()
21+
/**
22+
* PostgreSQL session store
23+
*/
24+
function getDatabaseSession() {
25+
const PGStore = connectPgSimple(expressSession)
26+
27+
const pool = new Pool({
28+
connectionString: POSTGRES_URL,
29+
ssl: NODE_ENV === 'production' ? { rejectUnauthorized: false } : false
30+
})
31+
32+
const store = new PGStore({
33+
createTableIfMissing: true,
34+
pool: pool
35+
})
36+
37+
return expressSession({
38+
cookie: {
39+
maxAge: config.sessionMaxAge,
40+
secure: NODE_ENV === 'production'
41+
},
42+
resave: false,
43+
saveUninitialized: false,
44+
secret: config.sessionName,
45+
store
46+
})
47+
}
48+
49+
export const session = POSTGRES_URL ? getDatabaseSession() : getCookieSession()

testapp/compose.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
services:
2+
db:
3+
env_file: .env
4+
image: postgres
5+
restart: always
6+
shm_size: 128mb
7+
8+
ports:
9+
- 5432:5432
10+
11+
volumes:
12+
- data_sql:/var/lib/postgresql
13+
- ../node_modules/connect-pg-simple/table.sql:/docker-entrypoint-initdb.d/init.sql
14+
15+
adminer:
16+
image: adminer
17+
restart: always
18+
19+
ports:
20+
- 8080:8080
21+
22+
volumes:
23+
data_sql:

testapp/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
},
99
"license": "MIT",
1010
"dependencies": {
11+
"connect-pg-simple": "^10.0.0",
1112
"cookie-session": "^2.1.1",
1213
"express": "^5.2.1",
14+
"express-session": "^1.19.0",
1315
"nhsuk-frontend": "^10.3.1",
1416
"nhsuk-prototype-kit": "*",
15-
"nunjucks": "^3.2.4"
17+
"nunjucks": "^3.2.4",
18+
"pg": "^8.19.0"
1619
},
1720
"files": [],
1821
"engines": {

0 commit comments

Comments
 (0)