Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

417
Visualizações
Secuela con configuración asíncrona en nodejs

Me he estado golpeando la cabeza durante días porque no puedo encontrar un ejemplo válido de configuración asíncrona en Sequelize

Entonces, como sabrá, simplemente puede configurar una instancia de Sequelize como esa

 const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname')

y luego declara tu modelo

 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 });

Sin embargo, ¿qué sucede cuando las credenciales de la base de datos provienen de un servicio externo?

 const credentials = await getDbCredentials(); const sequelize = new Sequelize({credentials})

dado que la creación de modelos de secuelas se combina con la creación de instancias (a diferencia de muchos otros ORM), esto se convierte en un gran problema.

Mi solución actual es la siguiente:

 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;

Sin embargo, creo que este no es un buen enfoque debido a la naturaleza asíncrona de la inicialización y, a veces, la db de datos no está definida. ¿Hay una mejor manera de abordar esta cosa? Gracias

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Puedes lograr esto con el gancho beforeConnect, algo como esto:

 sequelize = new Sequelize(config.database, '', '', config); sequelize.beforeConnect(async (config) => { config.username = await getSecretUsername(); config.password = await getSecretPassword(); });

Deje las credenciales iniciales vacías, luego use beforeConnect para mutar la configuración. No estoy seguro de si esta es la forma más limpia de usarlo, pero parece estar funcionando.

https://sequelize.org/master/manual/hooks.html

over 4 years ago · Santiago Trujillo Relatório

0

Para crear una funcion asincrona usamos async

function after5Seconds() {

return new Promise(resolve => {

setTimeout(() => {

resolve('resolved');

}, 5000);

});

}

async function asyncCallMethod() {

console.log('calling');

const result = await after2Seconds();

console.log(result);

// se espera la respuesta: "resolved"

}

asyncCallMethod();

over 4 years ago · Santiago Trujillo Relatório

0

Encontré una forma de secuela 'pura' para hacer esto a través deganchos de ciclo de vida:

Básicamente, una configuración genérica en un archivo db.js se vería así:

 const { Sequelize } = require('sequelize'); const asyncFetch = require('../util/async-fetch'); const sequelize = new Sequelize({ dialect: 'mysql', database: 'db_name', host: '127.0.0.1' }); sequelize.beforeConnect(async (config) => { const [username, password] = await Promise.all([ asyncFetch('username'), asyncFetch('password') ]); config.username = username; config.password = password; }); module.exports = sequelize;

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda