如何将MySQL查询结果赋值给变量以填充Inquirer选项?
解决MySQL异步查询结果无法填充Inquirer选项的问题
问题根源
db_conn.query是异步操作,你当前的代码直接把query方法返回的Query实例对象(不是查询结果)赋值给了questions.roles,导致打印出_events这类内置属性。同时,后续的console.log和inquirer.prompt会在查询完成前就执行,回调函数里的代码根本没机会触发,自然拿不到真实的查询结果。
修正方案1:回调嵌套确保执行顺序
把依赖查询结果的逻辑(生成选项、Inquirer交互、删除操作)全部放到query的回调函数内,保证只有拿到结果后才执行后续步骤:
case("13"): // Delete a role db_conn.query("SELECT title, id FROM role;", (err, results) => { if (err) { console.error(err); return; } console.table(results); // 把查询结果转换成Inquirer需要的选项格式 questions.roles = results.map(role => ({ name: role.title, value: role.id })); // 执行Inquirer交互 inquirer.prompt(questions.deleteRole).then(delRoleAnswers => { // 取交互结果中对应的字段(假设deleteRole的prompt name是roleId) const roleId = delRoleAnswers.roleId; // 执行删除操作 db_conn.query(queries.deleteRole, [roleId], (err, res) => { if (err) { console.error(err); return; } console.log(`Deleted role with ID ${roleId}`); }); }); }); break;
修正方案2:用async/await简化异步逻辑(更推荐)
将case内的逻辑封装成async函数,用await处理异步操作,代码可读性更高:
case("13"): // Delete a role (async () => { try { // 将query包装为Promise,用await获取结果 const results = await new Promise((resolve, reject) => { db_conn.query("SELECT title, id FROM role;", (err, res) => { err ? reject(err) : resolve(res); }); }); console.table(results); // 转换为Inquirer选项格式 questions.roles = results.map(role => ({ name: role.title, value: role.id })); // await获取Inquirer交互结果 const delRoleAnswers = await inquirer.prompt(questions.deleteRole); const roleId = delRoleAnswers.roleId; // 执行删除操作 await new Promise((resolve, reject) => { db_conn.query(queries.deleteRole, [roleId], (err, res) => { err ? reject(err) : resolve(res); }); }); console.log(`Deleted role with ID ${roleId}`); } catch (err) { console.error(err); } })(); break;
额外注意事项
- 必须处理异步操作可能出现的错误,避免程序崩溃
- 确保
questions.deleteRole的配置中,choices字段正确引用questions.roles - 原代码中
inquirer.prompt()返回的是Promise,不能直接赋值给变量使用,必须通过.then()或await获取真实的交互结果
内容的提问来源于stack exchange,提问作者cwen13
相关产品推荐
相关产品推荐

