我正在使用inquirer.js来构建一个命令行雇员数据库。是否可以从inquirer.js中的sql数据库动态填充选择数组?
例如
inquirer.prompt([
{ type: 'list',
message: "Choose department to add Role to",
name: "department",
choices: [
`SELECT * FROM departments`
]
}
])离开是我想要访问的表,我希望它返回所有部门的列表作为选择
发布于 2022-07-24 23:58:19
实际上,我最近遇到了这个问题,并且有了一个有效的解决方案!!
查询器的选择键可以使用函数定义,但希望函数返回一个对象数组;每个对象表示一个选项,并有一个name:键作为选项向用户显示,value:键是inquirer在应答对象中存储的答案值(例如数字、字符串或布尔值等)。下面是一个结构的示例,选择键期望从函数返回:
[
{
name: 'Choice 1',
value: 1,
},
{
name: 'Choice 2',
value: 'Something',
},
{
name: 'Choice 3',
value: false,
}
]确保您检查您的函数返回的数据,并确保您有这种格式,以便inquirer的选择键接受它!
下面是我如何用数据库实现它:
我在连接上使用了一个.promise(),这样我就可以使用异步/等待语法。下面是我为mysql2建立的连接:
// use .promise() so that we can use await on connection
const connection = mysql.createConnection({
host: 'localhost',
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: 'employees_db',
}).promise();下面是一个特殊的问题对象,它的choices:由一个名为departmentChoices()的函数定义,该函数从mysql数据库中获取所有部门的选择。确保这也是在异步函数中定义的,以便您可以使用await。
{
message: "Which Department's budget do you want to see?",
name: 'id',
type: 'list',
choices: await departmentChoices(),
when(answers) {
return answers.task === 'View a Department Budget';
},
},这是函数定义。为了便于可读性,我选择使用异步/等待数据库查询。为了获得更好的错误处理和最佳实践,您可能应该将其包装在try/catch中。注意,我对id使用了别名value,因为这是我希望在选择对象中为value:键使用的值。name不需要别名,因为它是我希望存储在选择对象中的name:键下的值。
const departmentChoices = async () => {
const departmentQuery = `SELECT id AS value, name FROM department;`;
const departments = await connection.query(departmentQuery);
return departments[0];
};这是这个函数将从我的数据库返回的数组:
[
{ value: 1, name: 'Hair and Makeup' },
{ value: 2, name: 'Finance' },
{ value: 3, name: 'Set Design' },
{ value: 4, name: 'Wardrobe' }
]https://stackoverflow.com/questions/66626936
复制相似问题