连接Redis Cluster时出现SyntaxError: Unexpected token '.'错误的解决方法
问题
使用Redis Enterprise提供的代码连接数据库,运行node index.js时出现SyntaxError: Unexpected token '.'错误,Node.js版本为v12.22.9。
相关代码
index.js
import { createCluster } from 'redis'; import { readFileSync } from 'fs'; const cluster = createCluster({ rootNodes: [{ url: 'rediss://redis.cloud.com:6379' }], defaults: { password: 'abc', socket: { tls: true, ca: [readFileSync('~/redis_ca.pem')] }}});
package.json
{ "name": "redis-demo", "version": "1.0.0", "description": "", "main": "redis-demo.js", "type": "module", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "run": "node index.js" }, "author": "", "license": "ISC", "dependencies": { "redis": "^4.6.7" } }
错误信息
$ node index.js /home/rnatarajan/node-redis-demo/node_modules/redis/dist/index.js:42 ...options?.modules ^ SyntaxError: Unexpected token '.' at wrapSafe (internal/modules/cjs/loader.js:915:16) at Module._compile (internal/modules/cjs/loader.js:963:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) at Module.load (internal/modules/cjs/loader.js:863:32) at Function.Module._load (internal/modules/cjs/loader.js:708:14) at ModuleWrap. (internal/modules/esm/translators.js:188:29) at ModuleJob.run (internal/modules/esm/module_job.js:145:37) at async Loader.import (internal/modules/esm/loader.js:182:24) at async Object.loadESM (internal/process/esm_loader.js:68:5)
解决方案
错误核心原因是Node.js v12.22.9不支持可选链操作符(?.),而你安装的redis@4.6.7内部代码使用了该语法,导致运行报错。有两种修复方式:
方案1:升级Node.js版本
redis@4.x要求Node.js版本至少为v14.14.0或更高。直接升级Node.js到v14及以上的LTS版本(比如v18.x),之后重新运行node index.js即可解决问题。
方案2:降级redis到兼容Node.js v12的版本
若无法升级Node.js,可将redis包降级到v3.x版本,该版本兼容Node.js v12。操作步骤:
- 卸载当前redis包:
npm uninstall redis
- 安装v3.x版本的redis:
npm install redis@3
- 修改
index.js适配v3.x的API(v3使用CommonJS规范,需调整代码):
const Redis = require('redis'); const fs = require('fs'); const cluster = new Redis.Cluster([{ host: 'redis.cloud.com', port: 6379 }], { redisOptions: { password: 'abc', tls: { ca: [fs.readFileSync('~/redis_ca.pem')] } } });
同时移除package.json中的"type": "module"字段。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

