gpt4 book ai didi

node.js - 用单例 Sequelize

转载 作者:行者123 更新时间:2023-12-03 22:23:40 25 4
gpt4 key购买 nike

我正在使用 Sequelizenode.js这个想法是使用 Singleton图案。

阅读如何 nodemodules caching 一起使用和一些单例示例

我此刻的文件是:

const DBManager = (function () {

// Instance stores a reference to the Singleton
let instance: any;

let db: string = null;
let user: string;
let password: string;
let host: string;
let sequelize: Sequelize.Sequelize;

function init(bdName: string) {
db = bdName;
user = process.env.MYSQL_DB_USERNAME || 'root';
password = process.env.MYSQL_DB_PASSWORD || 'root';
host = process.env.MYSQL_DB_HOST || 'localhost';

return {
open: () => {
sequelize = new Sequelize(db, user, password, {
host: host,
dialect: 'mysql',
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
operatorsAliases: false,
logging: !process.env.HIDE_LOGS
});
},

testConnection: () => {
return sequelize.authenticate();
},

getManagerObject: () => {
return sequelize;
},

close: () => {
sequelize.close();
}
};
}

return {
// Get the Singleton instance if one exists
// or create one if it doesn't
getInstance: (bd?: string) => {

if (!instance) {
instance = init(bd);
}

return instance;
}
};

})();

export default DBManager;

因此,正如预期的那样,当我在项目中的任何地方需要此文件时,引用是相同的并且按预期工作。

我不确定这是否是实现 Singleton pattern 的正确方法,或者如果有一个定义和记录的,因为官方文档没有说明这一点。

最佳答案

通常不需要显式的单例实现。 JS 模块(尤其是 CommonJS 和 ES 模块)在正常情况下只评估一次,导出的类实例有效地是一个单例。

也不需要 IIFE,因为模块有自己的范围。由于init函数没有被重用,也可能不需要它。可以简化为:

export default {
open: ...
testConnection: ...
...
};

这种抽象是不切实际的。已经有 sequelize例如,为其自己的方法创建包装方法并没有很好的用途。

由于连接在建立后可用,因此只导出连接的 promise 是有意义的,类似于 this answer 中所示的连接。 .

如果配置(数据库名称)在数据库管理器模块中可用,最好就地使用它:
// db.js
const dbName = someConfig.db;
const sequelize = new Sequelize(dbName, ...);

export default sequelize.authenticate().then(() => sequelize);

使用如下:
import dbConnection from './db';

dbConnection.then(sequelize => { /* all code that depends on the connection */ });

如果可能有多个连接,或者导入时配置不可用,则导出工厂函数:
// db.js
export default dbName => {
const sequelize = new Sequelize(dbName, ...);
sequelize.authenticate().then(() => sequelize);
}

单例实例自然是用模块处理的:
// foo-db.js
import getDbConnection from './db';

export default getFooDbName().then(dbName => getDbConnection(dbName));

并使用如下:
import dbConnection from './foo-db';

dbConnection.then(sequelize => { /* all code that depends on the connection */ });

关于node.js - 用单例 Sequelize ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com