Typescript搭配NodeRedis连接Redis时出现queueMicrotask错误如何解决
问题根因
该报错是Node.js版本过低导致的:你安装的是v4.x及以上版本的redis(NodeRedis)包,该版本依赖Node.js 12.x及以上运行环境,内部用到了queueMicrotask API,而你当前使用的Node.js版本低于11.0.0,原生没有提供这个API,因此触发引用错误。
解决方案
可根据你的项目情况选择以下任意一种方案:
- 方案1(最推荐):升级Node.js版本到12.x或更高的LTS版本,升级完成后重新执行
npm install安装依赖即可正常运行原有代码。 - 方案2(兼容低版本Node.js):降级
redis包到v3版本,该版本兼容低版本Node.js:- 卸载现有redis包:
npm uninstall redis - 安装v3版本:
npm install redis@3
注意v3版本API和v4存在差异:无需主动调用connect()、disconnect()方法,创建客户端后默认自动连接,set方法的参数格式也需要调整,示例如下:
import * as redis from 'redis'; import { promisify } from 'util'; const redisClient = redis.createClient(); const setAsync = promisify(redisClient.set).bind(redisClient); redisClient.on('error', (err: Error) => { console.log('Error', err.name); }); redisClient.on('connect', () => console.log('Ok')); try { await setAsync(token, email, 'EX', '40', 'NX'); } catch (err) { console.log('Error', err); } - 卸载现有redis包:
- 方案3(临时兼容):不想调整版本的话,可以在项目入口文件最顶部添加
queueMicrotask的polyfill代码:
该方案仅为临时兼容方案,不建议长期使用。declare global { function queueMicrotask(callback: () => void): void; } if (typeof queueMicrotask === 'undefined') { (global as any).queueMicrotask = (callback: () => void) => Promise.resolve().then(callback); }
内容的提问来源于stack exchange,提问作者Samuel Sánchez Álvarez
相关产品推荐
相关产品推荐

