【发布时间】:2022-02-10 17:37:52
【问题描述】:
我试图创建一个连接到数据库的命令,我创建了一个小 CLI 脚本,该脚本循环遍历特定文件夹中的文件以获取命令类模块
我的问题是,在我的一个命令中,我正在尝试连接到 sequelize,但它似乎没有做任何事情。我没有得到控制台的输出,甚至似乎也没有尝试连接
这可能是因为我仍然在努力弄清楚如何正确地执行同步/异步/等待的东西...注意我是如何使用glob.sync 的,因为我想同步循环遍历文件,但随后在我的命令我需要使用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.')
这是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
我已经设置了 npx,所以我可以运行 npx unity migrate,它会根据 migrate 签名调用这个命令
现在我的控制台应该显示connection successful 或unable to connect,然后是migrate run complete,但我在控制台中看到的只是migrate run complete。就好像它根本没有尝试连接......
我不知道我在这里做错了什么。
【问题讨论】:
-
这与How do I return the result of an asynchronous call? 密切相关,但我们可以在回答这个特定问题方面做得更好,而不是将其作为副本关闭,因为 OP 实际上不需要使代码同步.
-
为什么你在一次成功运行后会
process.exit()?这将忽略除第一个文件之外的所有文件...? -
@T.J.Crowder 因为如果通过签名找到命令,那么我们知道这是要运行的命令,因此我们不需要检查任何其他命令。跨度>
-
知道了。我以为你想一次只做一个,而不仅仅是你找到的第一个。
-
是的,我基本上只是想遍历目录中的所有文件,一旦找到具有特定签名的类,就不需要继续遍历文件。希望这是有道理的。对 JS 世界来说还是很新的东西。
标签: javascript node.js async-await