Node.js 所有将readline保持在屏幕底部的尝试都会导致输入清除

Node.js 所有将readline保持在屏幕底部的尝试都会导致输入清除,node.js,readline,Node.js,Readline,我目前正试图在屏幕底部保留一个输入,这样我就可以在顶部保留一个日志,同时也允许使用命令。我在网上找到的所有解决方案都有效,但问题是每当我使用winston(和自定义传输)登录时,readline提示符就会清除,但会一直保留到底部。它不是真的被清除了,它只是清除了它的视觉效果。如中所示,如果您正在键入“abc”,但在键入“a”后会有一个新的日志,并且您继续键入,则提示将仅显示“>bc”,但当您按enter键时,程序会正确地将该行识别为“abc” 这就是我现在要处理的事情 //console.js

我目前正试图在屏幕底部保留一个输入,这样我就可以在顶部保留一个日志,同时也允许使用命令。我在网上找到的所有解决方案都有效,但问题是每当我使用winston(和自定义传输)登录时,readline提示符就会清除,但会一直保留到底部。它不是真的被清除了,它只是清除了它的视觉效果。如中所示,如果您正在键入“abc”,但在键入“a”后会有一个新的日志,并且您继续键入,则提示将仅显示“>bc”,但当您按enter键时,程序会正确地将该行识别为“abc”

这就是我现在要处理的事情

//console.js

const readline = require("readline");

module.exports = () => {
  const cli = readline.createInterface(process.stdin, process.stdout);
  const logger = require("./logger.js")(cli);
  cli.setPrompt("> ", 2);
  cli.on("line", (line) => {
    logger.info(line);
    cli.prompt();
  });
  cli.prompt();

  return logger;
};


//logger.js

const winston = require("winston");

class ConsoleTransport extends require("winston-transport") {
  log(info, callback){
    setImmediate(() => { this.emit('logged', info); });

    this.cli.output.write('\x1b[2K\r');
    console.log(info.message);
    this.cli._refreshLine();

    callback();
  }
}

module.exports = (cli) => {
  let consoleTransport = new ConsoleTransport();
  consoleTransport.cli = cli;

  return winston.createLogger({
    format: winston.format.combine(
      winston.format.colorize(),
      winston.format.simple()
    ),

    transports: [
      consoleTransport
    ]
  });
};