Nodejs требует асинхронного модуля

Я пытаюсь загрузить 2 модуля асинхронно, потому что у меня мало проблем.

  1. Первый модуль загружается и создает соединение с базой данных (для этого требуется какое-то время)
  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.info(`${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.info(`${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.info(`${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.info('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
        }
    }));

}

И основной server.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.info(`${chalk.green('✓')} Server disponibile all'indirizzo ${chalk.green(process.env.SERVER_URL + ':' + process.env.SERVER_PORT)}.`);
});
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
76
2

Ответы 2

Что ж, нужно сделать второй модуль, дождитесь первого или загрузите второй модуль только после того, как загрузится первый.

Самый простой способ сделать это в вашем коде - передать модулю 1 объект сервера:

то вы можете сделать это из модуля 1. require ('./ session') (сервер)

Вы также можете написать модуль 1 таким образом, чтобы он возвращал обещание, а затем:

return mysql2
  .createConnection({})
  .then(db = > {
     const connectionSeqalize  = ....
     return Promise.resolve(connectionSeqalize)
   })

Затем из server.js или модуля 2,

require('database').then(connectionSeqalize => {})

Я бы предложил провести рефакторинг, чтобы модуль sql установил промежуточное звено на сервере. что избавит вас от добавления лишней логики для загрузки асинхронных модулей.

Так вы предлагаете загрузить модуль на server.js? Беванде, в будущем моя идея состоит в том, чтобы полюбить 5 файлов конфигурации (db, sessions, sequelize Relations и server middlewares), которые все модули импортированы внутри server.js. Таким образом, у меня есть отдельные файлы конфигурации. Логика

Simone Giannino 01.12.2018 18:41

Я не понимаю, что ты имеешь в виду. Вы всегда можете запросить модуль несколько раз с разными конфигурациями и каждый раз (разные БД, разные экспресс-серверы и т. д.)

Mazki516 01.12.2018 18:45

и учтите, даже если вы используете 10 разных баз данных, все еще будет использовать только одну базу данных для сеансов.

Mazki516 01.12.2018 18:47

да, да, я создал модуль для подключения к базе данных по основной причине: создать экземпляр sequelize (который является подключением к базе данных) для совместного использования во всем приложении с использованием модулей.

Simone Giannino 01.12.2018 18:50

Хорошо, а чего еще не хватает в моем ответе? Я не уверен .

Mazki516 01.12.2018 19:04

Вы можете добавить требование после создания соединения внутри .then(connection => REQUIRE_HERE)

Другие вопросы по теме