Estoy tratando de hacer un comando que se conecte a la base de datos, creé un pequeño script CLI que recorre archivos en carpetas específicas para obtener módulos de clase de comando
mi problema es que en uno de mis comandos, intento conectarme para secuenciar, y simplemente no parece estar haciendo nada. no obtengo salida a la consola, ni siquiera parece intentar conectarse
esto probablemente se deba a que todavía estoy luchando por descubrir cómo hacer correctamente las cosas de sincronización / sincronización / espera ... observe cómo uso glob.sync porque quiero recorrer los archivos de forma síncrona, pero luego en mi comando i necesita conectarse a la base de datos usando await
cli.js :
#! /usr/bin/env node const patterns = [ './node_modules/unity/src/commands/**/*.js', './src/commands/**/*.js', ] const glob = require('glob') const path = require('path') const yargs = require('yargs') const signature = yargs.argv._[0] const process = require('process') patterns.forEach(pattern => { glob.sync(pattern).forEach(file => { const commandPath = path.resolve(file) const command = require(commandPath) if (command.signature == signature) { command.argv = yargs.argv command.run() process.exit() } }) }) console.log('Command not found.') aquí hay un comando de ejemplo en una de las carpetas de commands :
const { Sequelize } = require('sequelize') class MigrateCommand { static signature = 'migrate' static argv = {} static run() { const sequelize = new Sequelize({ dialect: 'mysql', host: 'localhost', port: 3306, database: 'dio_unity2', username: 'root', password: '', }) const connect = async () => { try { await sequelize.authenticate() console.log('Connection successful.') } catch (error) { console.error('Unable to connect.', error) } } connect() console.log('migrate run complete') } } module.exports = MigrateCommand configuré npx para que pueda ejecutar npx unity migrate y llamará a este comando según la firma de migrate
ahora mi consola debería decir que connection successful o unable to connect y luego la ejecución de migrate run complete , pero todo lo que veo en la consola es la migrate run complete . es como si ni siquiera estuviera tratando de conectarse en absoluto...
No tengo idea de lo que estoy haciendo mal aquí.
No puede hacer que un proceso asincrónico sea sincrónico sin generar un nuevo hilo y esperarlo sincrónicamente. (Hay un paquete npm que hace eso, a través de execSync ).
Pero la buena noticia aquí es que no es necesario en su código. Quiere hacer las cosas en serie , pero hacer las cosas en serie no es lo mismo que hacerlas sincrónicamente . Así es cómo:
En primer lugar, la run no puede hacer que el proceso asíncrono se inicie a través de la authenticate sincrónica. Entonces, en su lugar, la run debería ser async (y no necesitamos connect ):
static async run() { const sequelize = new Sequelize({ dialect: 'mysql', host: 'localhost', port: 3306, database: 'dio_unity2', username: 'root', password: '', }) try { await sequelize.authenticate() console.log('Connection successful.') } catch (error) { console.error('Unable to connect.', error) } console.log('migrate run complete') } A continuación, en el script, recorremos sus patrones y archivos usando una función async :
(async () => { for (const pattern of patterns) { for (const file of glob.sync(pattern)) { const commandPath = path.resolve(file) const command = require(commandPath) if (command.signature == signature) { command.argv = yargs.argv await command.run() // *** Note the `await` process.exit() } } } console.log("Command not found.") })();Eso hace el trabajo de forma asincrónica, pero uno tras otro (en serie).
Si fuera yo, no usaría process.exit() para finalizar el proceso, es una forma muy agresiva de finalización del proceso que puede evitar que algunas cosas finalicen ( detalles aquí ), y puede no ser tan claro para las personas que hacen código. mantenimiento más tarde como alternativas. Ahora que hemos puesto el código en una función contenedora, simplemente saldría de la función para romper los bucles:
await command.run(); return;