Fix express and session for production

This commit is contained in:
Samuel Ortion 2022-08-29 14:05:34 +02:00
parent 9e8404db11
commit 13f37a14e8
11 changed files with 75 additions and 44 deletions

5
.gitignore vendored
View File

@ -65,4 +65,7 @@ typings/
.ideas .ideas
data/* data/*
!/data/.gitkeep !/data/.gitkeep
push.sh
.rsyncignore

12
app.js
View File

@ -2,6 +2,8 @@ require('dotenv').config();
const createError = require('http-errors'); const createError = require('http-errors');
const express = require('express'); const express = require('express');
const session = require('express-session'); const session = require('express-session');
let { redisClient } = require('./redis');
let RedisStore = require('connect-redis')(session);
const csrf = require('csurf'); const csrf = require('csurf');
const path = require('path'); const path = require('path');
const cookieParser = require('cookie-parser'); const cookieParser = require('cookie-parser');
@ -35,6 +37,7 @@ const sess = {
if (app.get('env') === 'production') { if (app.get('env') === 'production') {
app.set('trust proxy', 1); // trust first proxy app.set('trust proxy', 1); // trust first proxy
sess.cookie.secure = true; // serve secure cookies sess.cookie.secure = true; // serve secure cookies
sess.store = new RedisStore({ client: redisClient });
} }
app.use(session(sess)); app.use(session(sess));
@ -67,15 +70,6 @@ app.use('/dist/leaflet', express.static('node_modules/leaflet/dist'));
app.use('/dist/feather', express.static('node_modules/feather-icons/dist')); app.use('/dist/feather', express.static('node_modules/feather-icons/dist'));
app.use('/dist/axios', express.static('node_modules/axios/dist')); app.use('/dist/axios', express.static('node_modules/axios/dist'));
app.use(function (req, res, next) {
res.header('Access-Control-Allow-Origin', 'http://localhost:3000');
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept'
);
next();
});
app.use('/api/0', apiRouter); app.use('/api/0', apiRouter);
const csrfProtection = csrf({ cookie: true }); const csrfProtection = csrf({ cookie: true });

View File

@ -32,23 +32,34 @@ function quizz(req, res) {
} }
function check(req, res) { function check(req, res) {
const answer = req.query.species; let answer, correct;
const correctAnswer = req.session.answer; try {
answer = req.query.species;
correct = req.session.answer;
} catch (error) {
console.error(error);
}
let result = {}; let result = {};
if (answer === correctAnswer.speciesCode) { try {
debug("Correct answer"); if (correct === undefined) {
result = { console.error("No answer found in session");
correct: true, } else if (answer === correct.speciesCode) {
message: req.i18n.__('Correct!'), debug("Correct answer");
answer: correctAnswer result = {
}; correct: true,
} else { message: req.i18n.__('Correct!'),
debug("Wrong answer"); answer: correct
result = { };
correct: false, } else {
message: req.i18n.__('Wrong!'), debug("Wrong answer");
answer: correctAnswer result = {
}; correct: false,
message: req.i18n.__('Wrong!'),
answer: correct
};
}
} catch (error) {
console.error(error);
} }
res.json(result); res.json(result);
} }

View File

@ -1,16 +1,5 @@
require('dotenv').config(); const { redisClient } = require('../redis');
const debug = require('debug')('soundbirder:cache'); const debug = require('debug')('soundbirder:cache');
const redis = require('redis');
const host = process.env.REDIS_HOST ? process.env.REDIS_HOST : 'localhost';
const port = process.env.REDIS_PORT ? process.env.REDIS_PORT : 6379;
const url = `redis://${host}:${port}`;
const redisClient = redis.createClient({
url
});
(async () => {
redisClient.connect();
})();0
function cacheResponse(request, response) { function cacheResponse(request, response) {
debug("Caching response", request); debug("Caching response", request);

View File

@ -21,11 +21,11 @@ async function generateQuizz(coordinates, locale, size) {
answer = choice(speciesSelectionLocalized); answer = choice(speciesSelectionLocalized);
quizz.answer = answer; quizz.answer = answer;
quizz.audio = await getAudio(answer.sciName); quizz.audio = await getAudio(answer.sciName);
if (quizz.audio == undefined) { if (quizz.audio === undefined) {
debug("No audio found for species", answer.sciName); debug("No audio found for species", answer.sciName);
debug("Trying again..."); debug("Trying again...");
} }
} while (quizz.audio == undefined); } while (quizz.audio === undefined);
debug("Got answer", answer); debug("Got answer", answer);
debug("Got audio", quizz.audio); debug("Got audio", quizz.audio);
} catch (error) { } catch (error) {

View File

@ -1,4 +1,4 @@
version: '3.9' version: '3'
services: services:
express: express:
@ -10,8 +10,10 @@ services:
- NODE_ENV=production - NODE_ENV=production
- REDIS_HOST=${REDIS_HOST:-soundbirder_redis} - REDIS_HOST=${REDIS_HOST:-soundbirder_redis}
- REDIS_PORT=${REDIS_PORT:-6379} - REDIS_PORT=${REDIS_PORT:-6379}
- DEBUG=${DEBUG:-""}
ports: ports:
- "${EXPRESS_PORT:-3000}:3000" - "${EXPRESS_PORT:-3000}:3000"
restart: unless-stopped
networks: networks:
- soundbirder_network - soundbirder_network
depends_on: depends_on:

View File

@ -2,12 +2,12 @@ FROM node:16.17.0
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY package*.json . COPY package*.json ./
RUN npm install RUN npm install
RUN npm ci --only=production RUN npm ci --only=production
COPY . . COPY . ./
EXPOSE 3000 EXPOSE 3000
CMD [ "./bin/www" ] CMD [ "./bin/www" ]

View File

@ -1,4 +1,4 @@
{ {
"Game": "Game", "Game": "Spiel",
"About": "About" "About": "About"
} }

14
package-lock.json generated
View File

@ -11,6 +11,7 @@
"@unclesamulus/ebird-api": "^0.0.0", "@unclesamulus/ebird-api": "^0.0.0",
"@unclesamulus/xeno-canto-api": "^0.0.0", "@unclesamulus/xeno-canto-api": "^0.0.0",
"axios": "^0.27.2", "axios": "^0.27.2",
"connect-redis": "^6.1.3",
"cookie-parser": "~1.4.4", "cookie-parser": "~1.4.4",
"csurf": "^1.11.0", "csurf": "^1.11.0",
"debug": "~2.6.9", "debug": "~2.6.9",
@ -282,6 +283,14 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/connect-redis": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz",
"integrity": "sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw==",
"engines": {
"node": ">=12"
}
},
"node_modules/constantinople": { "node_modules/constantinople": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
@ -1545,6 +1554,11 @@
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
} }
}, },
"connect-redis": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz",
"integrity": "sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw=="
},
"constantinople": { "constantinople": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",

View File

@ -9,6 +9,7 @@
"@unclesamulus/ebird-api": "^0.0.0", "@unclesamulus/ebird-api": "^0.0.0",
"@unclesamulus/xeno-canto-api": "^0.0.0", "@unclesamulus/xeno-canto-api": "^0.0.0",
"axios": "^0.27.2", "axios": "^0.27.2",
"connect-redis": "^6.1.3",
"cookie-parser": "~1.4.4", "cookie-parser": "~1.4.4",
"csurf": "^1.11.0", "csurf": "^1.11.0",
"debug": "~2.6.9", "debug": "~2.6.9",

17
redis.js Normal file
View File

@ -0,0 +1,17 @@
const redis = require('redis');
const redisHost = process.env.REDIS_HOST ? process.env.REDIS_HOST : 'localhost';
const redisPort = process.env.REDIS_PORT ? process.env.REDIS_PORT : 6379;
const url = `redis://${redisHost}:${redisPort}`;
const redisClient = redis.createClient({
url,
legacyMode: true
});
(async () => {
redisClient.connect()
})();
module.exports = {
redisClient
}