Я несколько дней ломал голову, так как не могу найти действительный пример конфигурации asyn c в Sequelize
Так что, как вы знаете, вы можете просто настроить экземпляр Sequelize следующим образом
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname')
и затем объявите свою модель
const User = sequelize.define('User', {
// Model attributes are defined here
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
// allowNull defaults to true
}
}, {
// Other model options go here
});
Однако что происходит, когда учетные данные db поступают из внешней службы?
const credentials = await getDbCredentials();
const sequelize = new Sequelize({credentials})
, поскольку создание последовательных моделей в сочетании с созданием экземпляра (в отличие от многих других ORM) становится большой проблемой.
Мое текущее решение заключается в следующем:
const Sequelize = require("sequelize");
// Models
const { User } = require("./User");
const env = process.env.NODE_ENV || "development";
const db = {};
let sequelize = null;
const initSequelize = async () => {
if (!sequelize) {
let configWithCredentials = {};
if (env === "production") {
const credentials = await getDbCredentials();
const { password, username, dbname, engine, host, port } = credentials;
configWithCredentials = {
username,
password,
database: dbname,
host,
port,
dialect: engine,
operatorsAliases: 0
};
}
const config = {
development: {
// Dev config
},
production: configWithCredentials,
};
sequelize = new Sequelize(config[env]);
sequelize.authenticate().then(() => {
console.log("db authenticated")
});
});
}
db.User = User;
db.sequelize = sequelize;
db.Sequelize = Sequelize;
};
initSequelize().then(() => {
console.log("done");
});
module.exports = db;
Однако я чувствую, что это не очень хороший подход из-за асинхронного характера инициализации, и иногда db
не определен. Есть ли лучший способ приблизиться к этой вещи? Спасибо