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

Node.js临时暂停全局键盘监听以执行输入提示的最佳方案

临时暂停全局键盘监听的最优方案

问题根源在于全局开启了process.stdin.setRawMode(true),终端会关闭输入回显,同时持续的keypress监听会干扰readlineSync.question的正常交互。最优方案是在调用SellFunction时临时恢复终端正常模式、移除keypress监听,完成输入后再还原全局监听状态。

具体实现步骤:

  • 把keypress事件的监听器单独存为变量,方便后续移除和重新绑定
  • 在SellFunction执行前:关闭raw模式、移除keypress事件监听
  • 完成用户输入后:重新开启raw模式、绑定keypress事件监听

修改后的完整代码示例:

const readline = require('readline');
const readlineSync = require('readline-sync');

// 把keypress监听器存为变量,方便移除/重新绑定
const keypressHandler = (str, key) => {
  if (key.ctrl && key.name === 'c') {
    console.log("Let's stop here");
    process.exit();
  } else if (key.name === 's') {
    SellFunction();
  }
};

// 初始化全局键盘监听
readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
process.stdin.setEncoding("utf8");
process.stdin.on('keypress', keypressHandler);

function SellFunction() {
  // 临时关闭全局键盘监听和raw模式
  process.stdin.removeListener('keypress', keypressHandler);
  process.stdin.setRawMode(false);

  // 这里可以正常使用readlineSync,终端会显示输入字符
  let sell_ratio = readlineSync.question(`How many %% of your tokens do you want to sell? (enter '50' for 50% / push Enter or 'y' to sell all): `);
  
  // 处理输入逻辑(示例)
  console.log(`You chose to sell ${sell_ratio}% tokens`);

  // 恢复全局键盘监听和raw模式
  process.stdin.setRawMode(true);
  process.stdin.on('keypress', keypressHandler);
}

关键说明:

  • process.stdin.removeListener('keypress', keypressHandler):精准移除之前绑定的监听器,避免残留
  • process.stdin.setRawMode(false):恢复终端正常输入模式,让readlineSync可以正常回显输入字符
  • 输入完成后必须还原raw模式和监听器,保证后续全局键盘监听正常工作

内容的提问来源于stack exchange,提问作者Tsar Buig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:57:26