Я пытаюсь загрузить 2 модуля асинхронно, потому что у меня мало проблем.
- Первый модуль загружается и создает соединение с базой данных (это занимает некоторое время)
- Второй модуль использует созданное соединение для создания сеансов с использованием экспресс-сессий.
Проблема в том, что второй модуль загружается раньше первого.
Это код модуля 1.
const sequelize = require('sequelize');
const chalk = require('chalk');
const mysql2 = require('mysql2/promise');
// Lettura variabili dal file di configurazione .env
const DATABASE_USER = process.env.DATABASE_USER;
const DATABASE_PASSWORD = process.env.DATABASE_PASSWORD;
const DATABASE_NAME = process.env.DATABASE_NAME;
const DATABASE_URL = process.env.DATABASE_URL;
const DATABASE_PORT = process.env.DATABASE_PORT;
const DATABASE_DIALECT = process.env.DATABASE_DIALECT;
// Connessione al database
let connectionSequelize;
// Connessione al DBMS
mysql2.createConnection({ user: DATABASE_USER, password: DATABASE_PASSWORD }).then((connection) => {
// Connessione al DBMS completata
// Creo il database se non esiste
connection.query(`CREATE DATABASE IF NOT EXISTS ${DATABASE_NAME}`).then(() => {
// Database creato, elimino la connessione con mysql2 e creo un instanza di sequelize che diventerà la connessione in tutto l'applicativo
connection.close();
connectionSequelize = new sequelize(DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD, { host: DATABASE_URL, dialect: DATABASE_DIALECT, port: DATABASE_PORT, operatorsAliases: false });
// Verifico che la connessione al database sia stata eseguita correttamente
connectionSequelize.authenticate().then(() => {
// Connessione eseguita correttamente
console.log(`${chalk.green('✓')} Connessione al database ${chalk.green(DATABASE_NAME.toUpperCase())} effettuata.`);
// Esporto la connessione che verrà utilizzata in tutta l'applicazione
module.exports = { connectionSequelize }
}).catch(error => {
// Connessione al database fallita, visualizza errore e termina il processo
console.log(`${chalk.red('✗')} Impossibile connettersi al database ${chalk.green(DATABASE_NAME.toUpperCase())}`);
process.exit();
})
}).catch(error => { throw (error); })
}).catch(error => {
// Connessione al database fallita, visualizza errore e termina il processo
console.log(`${chalk.red('✗')} Impossibile connettersi al database ${chalk.green(DATABASE_NAME.toUpperCase())} con mysql2`);
process.exit();
});
Код модуля 2:
const expressSession = require('express-session');
const MySQLStore = require('connect-session-sequelize')(expressSession.Store);
const connectionSequelize = require('./database').connectionSequelize
module.exports = server => {
console.log('in')
// Impostazioni caricate dal file di configurazione
const SESSION_SECRET_KEY = process.env.SESSION_SECRET_KEY;
const SESSION_MAXAGE_COOKIE = process.env.SESSION_MAXAGE_COOKIE;
const SESSION_DATABASE_TABLE = process.env.SESSION_DATABASE_TABLE;
const SESSION_COOKIE_NAME = process.env.SESSION_COOKIE_NAME;
server.use(expressSession({
resave: false,
saveUninitialized: false,
secret: SESSION_SECRET_KEY,
cookie: {
maxAge: SESSION_MAXAGE_COOKIE,
httpOnly: true
}
}));
}
И главный сервер. Js
const express = require('express');
const dotenv = require('dotenv').config();
const chalk = require('chalk');
// Istanza express
const server = express();
// Caricamento file di configurazione server
require('./config/database');
require('./config/session')(server);
// Impostazioni da file .env
const SERVER_PORT = process.env.SERVER_PORT
// Avvia il server sulla porta selezionata nel file di configurazione
server.listen(SERVER_PORT, () => {
console.log(`${chalk.green('✓')} Server disponibile all'indirizzo ${chalk.green(process.env.SERVER_URL + ':' + process.env.SERVER_PORT)}.`);
});