Node js 和 MySQL,我需要实现动态 MySql 连接,具体取决于谁连接到服务器

问题描述 投票:0回答:1

我有一个应用程序,我有不同的客户,比方说: 客户_1, 客户_2

我得到了sequlize配置

const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const fs = require('fs');
const path = require('path');
const db = {};
let sequelize = new Sequelize('db_schema', 'user', 'password', {
    dialect: 'mysql',
    host: '127.0.0.1',
    port: '3306',
    dialectOptions: {
        supportBigNumbers: true,
        bigNumberStrings: true
    },
    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    },
    logging: console.log
});

sequelize.authenticate()
    .then(() => {
        console.log('Database connection has been established successfully.');
    })
    .catch(err => {
        console.error('Unable to connect to the database:', err);
    });

fs.readdirSync(__dirname)
    .filter(function(file) {
        return (file.indexOf(".")!==0) && (file !== "index.js");
    })
    .forEach(function(file) {
        let model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
        db[model.name] = model;
    });

Object.keys(db).forEach(function(modelName) {
    if ("associate" in db[modelName]) {
        db[modelName].associate(db);
    }
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

每个客户都会有自己的 db_schema,所以我需要将每个客户与其架构连接起来,

如何实现?

我试图在互联网上查找,但找不到解决方案。

mysql node.js express sequelize.js
1个回答
0
投票

您将需要某种具有标识符的单例模式数据库池,例如在此示例代码中:

class DynamicDB  {
  constructor(database) {
    // all config, models, etc...
    this.instance = {};

  }

  // generates unique identifier for your instance
  static getDatabaseUniqueIdentifier(database) {
    return JSON.stringify(database).toString('base64');
  }

  /**
   * get instance of the database
   * @returns {DynamicDB}
   * @throws {Error} if instance is not initialized
   */
  static getInstance(database = {}) {
    !this.instance && (this.instance = {});
    const _id = DynamicDB.getDatabaseUniqueIdentifier(database);
    if (!this.instance[_id]) {
      this.instance[_id] = new DynamicDB(database || {});
    }
    return this.instance[_id];
  }

  /**
   * Close database connection and delete instance from memory
   * Use only if necessary
   * @returns {void}
   * @throws {Error} if instance is not initialized
   */
  static closeDatabase(database) {
    const _id = DynamicDB.getDatabaseUniqueIdentifier(database);
    this.instance[_id] && this.instance[_id].connection.close();
    this.instance[_id] = null;
  }

}

module.exports = DynamicDB;

© www.soinside.com 2019 - 2024. All rights reserved.