Node.js需要异步方式的模块

时间:2018-12-01 16:36:39

标签: javascript node.js express

我尝试以异步方式加载2个模块,因为我遇到的问题很少。

  1. 第一个模块加载并创建数据库连接( 一段时间)
  2. 第二个模块采用创建的连接来使用Express-Sessions进行会话。

问题是第二个模块在第一个模块之前加载。

这是模块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
        }
    }));

}

还有主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.log(`${chalk.green('✓')} Server disponibile all'indirizzo ${chalk.green(process.env.SERVER_URL + ':' + process.env.SERVER_PORT)}.`);
});

2 个答案:

答案 0 :(得分:0)

好吧, 您需要制作第二个模块,等待第一个模块 或仅在第一个模块加载后才加载第二个模块。

在代码上执行此操作最直接的方法是将服务器对象传递给模块1:

然后您可以在模块1中执行此操作。 require('./ session')(服务器)

您还可以通过以下方式编写模块1:返回承诺,然后:

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

然后从server.js或模块2中获取

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

我建议重构,以便在服务器上设置sql模块和中间件 这样可以避免您为异步模块加载添加额外的逻辑。

答案 1 :(得分:0)

创建连接后,您可以在.then(connection => REQUIRE_HERE)

内添加需求