Node.js中按键启停定时器函数遇addEventListener报错求助
问题根源
你这段代码是浏览器环境的写法,但Node.js是服务端运行环境,既没有window对象,也不存在浏览器的DOM事件机制——所以直接调用window.addEventListener会报window未定义;换成global也没用,因为global对象根本没有addEventListener方法,自然会触发this is not a function错误。
解决方案1:用Node.js内置readline模块(无额外依赖)
readline是Node.js内置模块,可直接监听终端输入事件,完美适配你的按键启停需求:
const readline = require('readline'); let refreshIntervalId; // 初始化readline,绑定终端输入输出 const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: true }); // 监听按键按下事件 rl.input.on('keydown', (e) => { switch (e.keyCode) { case 115: // F4键 start(); break; case 83: // 小写s键 stop(); break; } }); function start() { stop(); refreshIntervalId = setInterval(async () => { // 替换成你自己的Data异步函数 const result = await Data(); console.log(result); }, 5000); console.log('定时器已启动'); } function stop() { if (refreshIntervalId) { clearInterval(refreshIntervalId); refreshIntervalId = null; console.log('定时器已停止'); } } // 示例异步函数,替换为你的实际逻辑 async function Data() { return new Promise(resolve => { setTimeout(() => resolve('获取到的数据'), 100); }); } // 程序退出时清理资源 process.on('SIGINT', () => { rl.close(); stop(); process.exit(); });
解决方案2:用第三方keypress模块(更友好的按键识别)
如果需要监听组合键、特殊按键(如方向键),可以用keypress模块,先安装依赖:
npm install keypress
然后编写代码:
const keypress = require('keypress'); let refreshIntervalId; // 启用按键监听 keypress(process.stdin); // 监听按键事件 process.stdin.on('keypress', (ch, key) => { if (!key) return; // 按F4启动,按s停止 if (key.name === 'f4') { start(); } else if (key.name === 's') { stop(); } // 按Ctrl+C退出程序 if (key.ctrl && key.name === 'c') { stop(); process.exit(); } }); // 设置终端为原始模式,捕获所有按键输入 process.stdin.setRawMode(true); process.stdin.resume(); function start() { stop(); refreshIntervalId = setInterval(async () => { const result = await Data(); console.log(result); }, 5000); console.log('定时器已启动'); } function stop() { if (refreshIntervalId) { clearInterval(refreshIntervalId); refreshIntervalId = null; console.log('定时器已停止'); } } // 示例异步函数,替换为你的实际逻辑 async function Data() { return new Promise(resolve => { setTimeout(() => resolve('获取到的数据'), 100); }); }
注意事项
- Node.js终端的按键监听依赖stdin的原始模式,程序退出时记得通过
SIGINT事件清理资源,避免异常退出。 - 你的
Data是异步函数,用async/await替代.then写法,代码可读性更高。
内容的提问来源于stack exchange,提问作者JustForFun
相关产品推荐
相关产品推荐

