You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:01:11