6

我一直遇到查询器 npm 包的问题,​​无法在任何地方找到解决方案。我试图允许用户随时退出函数中的查询器提示并返回主菜单。但是,这似乎导致查询器提示的多个实例保持活动状态,从而导致此错误:

(节点:9756) MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。添加了 11 个退出侦听器。使用emitter.setMaxListeners() 增加限制

并且还导致特定功能中的询问者提示开始多次显示相同的提示。在尝试多次使用该功能后,我附上了该行为的图像。 提示错误

我尝试增加阻止内存泄漏错误的事件侦听器的最大数量,但查询器提示错误不受影响。

inquirer.prompt([
        {
            name: 'itemid',
            type: 'input',
            message: 'Please enter the product id. (type "exit" to return to main menu)',
            validate(answer) {

                //validates the id provided exists in the database. If exit is entered, returns to main().
                var valid = false;
                var exit = answer.toLowerCase();
                id = parseInt(answer);

                if (exit == "exit") {
                    return main();
                }

                for (var j = 0; j < idCheckArray.length; j++) {

                    if (answer == idCheckArray[j]) {

                        valid = true;

                    } else {
                    }
                }

                if (valid === true && exit != "exit") {

                    return (true);

                } else {

                    return ("Item ID does not exist. Please enter a valid ID.");
                }
            }
        },

我认为原因是通过从查询器验证函数中返回和调用 main,查询器不会调用其内置函数,因此每次执行此操作时,查询器创建的事件侦听器都不会被删除。

非常感谢任何有关如何解决此问题的帮助,谢谢。

4

1 回答 1

1

我所做的是创建一个名为 WantToExit 的函数

const WantToExit = () =>
  inquirer
    .prompt([
      {
        name: "moreQuery",
        type: "confirm",
        message: "Want to do anything else?",
      },
    ])
    .then((answer) => {
      if (answer.moreQuery) return init();
    });

请注意,init 是我运行第一个inquirer.prompt 的主要功能,例如

function init() {
  inquirer.prompt(initialQuestionsList).then(async (answer) => {
    console.log(answer);
    })

于 2021-05-23T03:58:29.493 回答