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
相关产品推荐
相关产品推荐

