【问题标题】:Passing SQL queries into Inquirer Prompt将 SQL 查询传递到 Inquirer Prompt
【发布时间】:2021-01-20 23:55:54
【问题描述】:

我正在尝试提取 SQL 查询结果并在查询器提示中填充选项。当控制台记录“选择”时,它会显示来自被调用的 SQL 查询的对象数组,但是当调用inquirer.prompt 并使用查询响应填充选择时,呈现给用户的选择显示为“未定义”。不完全确定发生了什么,因为我有一个几乎相同的功能可以完美运行。

const viewEmployeesByManager = async () => {
    const choices = await employeeDB_CRUD.getManagers();
    console.log(choices);
    return new Promise( (resolve, reject) => {
        inquirer.prompt([
            {
                name: "manager",
                type: "list",
                message: "Please select a department: ",
                choices: choices
            }
        ]).then( ({ manager }) => {
            console.log(manager);
            resolve();
        });
    });
}
const getManagers = () => {
    return new Promise((resolve, reject) => {
        connection.query(`SELECT CONCAT(b.first_name, " ", b.last_name) AS Name 
        FROM employee a LEFT JOIN employee b
        ON a.manager_id = b.id
        WHERE a.manager_id IS NOT NULL;`, (err, res) => {
            if (err) reject(err);
            resolve(res);
        });
    });
}

【问题讨论】:

  • 我对查询者一无所知,但是有一个名为 name 的列被名为 manager 的提示引用是否正确?
  • @Strawberry 是对的,请正确传递choices 数组。数组值可以是简单的数字、字符串或包含名称的对象。见github.com/SBoudrias/Inquirer.js/#question

标签: javascript mysql node.js inquirerjs


【解决方案1】:

按照Inquirer 上的文档,

具有“列表”类型的对象还必须使用带有选项和数组值的键值对。虽然选择变量控制台记录了一个对象数组,但它实际上仍然是一个等待表达式,这会导致您的异步函数暂停直到 Promise 被履行/拒绝,并在履行后恢复异步函数的执行。

根据MozdDocs on the await keyword,“当恢复时,await 表达式的值是已实现的 Promise 的值。”

这表明您的 choices 变量将会改变,因此最好实现 let 关键字,因为它表明该变量可能被重新分配,它将履行承诺。

请尝试一下,告诉我它是否有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2019-02-16
    • 2013-08-02
    相关资源
    最近更新 更多