如何使用节点和javascript在按回车键之前从终端读取用户输入?

问题描述 投票:0回答:2

如何使用节点和 JavaScript 在按 Enter 之前从终端读取用户输入?

我制作了一个简单的 javascript 应用程序,它使用 process.stdin 或 readline 来获取用户输入,但我不希望用户必须使用 Enter/Return 提交输入。 我想读取按键/按键上的用户输入。 这可能吗? 我怎样才能做到这一点? 谢谢!

要求:

  • javascript、节点
  • 从航站楼
  • 用户不需要通过 Enter/Return 提交字符串

更喜欢:

  • 更少的库,更多的普通 JavaScript
  • 处理任何键:字母、数字、箭头键、修饰键
javascript input terminal stdin keypress
2个回答
2
投票

一个简单的方法可以使用

iohook

Node.JS 的原生方式是这样的。

require("readline").emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);

process.stdin.on("keypress", (char, evt) => {
  console.log("=====Key pressed=====");
  console.log("Char:", JSON.stringify(char), "Evt:", JSON.stringify(evt));

  if (char === "h") console.log("Hello World!");
  if (char === "q") process.exit();
});

第一行,

require("readline").emitKeypressEvents(process.stdin)
使
process.stdin
发出按键事件,因为它通常不发出事件。

第二个,

process.stdin.setRawMode(true)
使
process.stdin
成为原始设备。在原始设备配置的流中,按键事件是按每个字符发出的,而不是按回车键发出的。

然后,将

keypress
事件监听器添加到
process.stdin
上以处理按键。

注意

process.stdin
转换为原始设备时,
Ctrl+C
不会发出
SIGINT
信号,换句话说,
Ctrl+C
不会停止程序。这意味着您需要手动绑定按键才能退出。


0
投票

这就是我在节点 16.20.1 上的工作:

process.stdin.setRawMode(true);
process.stdin.on("data", function(charBuffer) {
  const char = charBuffer.toString();
  if (char === "q") {
    process.exit();
  }
  console.log('do anything you want with this:', char);
});
© www.soinside.com 2019 - 2024. All rights reserved.