Node项目使用connect-redis 7.0.1出现ERR_REQUIRE_ESM错误求助
解决connect-redis的ERR_REQUIRE_ESM错误
环境版本
- Node:16.20.2
- connect-redis:7.0.1(实际package.json中为7.1.0)
- esm:3.2.25
- redis:3.0.2
- express-session:1.17.3
问题描述
使用connect-redis时触发ERR_REQUIRE_ESM错误,尝试更换redis、connect-redis和esm的多个版本均未解决。
错误信息
/Users/user/bidyaguru/bg-cpanel-app/server.js:1 Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/user/project/myapp/node_modules/connect-redis/dist/esm/index.js not supported. Instead change the require of index.js in null to a dynamic import() which is available in all CommonJS modules. at Object.<anonymous> (/Users/user/project/myapp/server.js:1) at Generator.next (<anonymous>) { code: 'ERR_REQUIRE_ESM' }
相关代码
package.json
{ "name": "myapp", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "server": "node -r esm server.js", "dev": "nodemon -r esm server.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "connect-redis": "^7.1.0", "dotenv": "^16.3.1", "esm": "^3.2.25", "express": "^4.18.2", "express-session": "^1.17.3", "mongoose": "^6.9.2", "redis": "^3.0.2" } }
server.js
import express from 'express'; import dotenv from 'dotenv'; import expressSession from'express-session'; import {createClient} from "redis"; import RedisStore from "connect-redis"; import connectDB from './config/db'; dotenv.config(); connectDB(); const app = express(); app.use(express.json()); app.get('/_status', (req, res) => { res.send('Server is okay'); }); // Initialize redis client. const redisHost = process.env.REDIS_HOST const redisPort = process.env.REDIS_PORT || 6379; let redisClient = createClient(redisHost, redisPort); redisClient.connect().catch(console.error) // Initialize redis store. let redisStore = new RedisStore({ client: redisClient, prefix: "myapp:", }) // Initialize redis sesssion storage. app.use( expressSession({ store: redisStore, resave: false, saveUninitialized: false, secret: "secret", cookie: { maxAge: (1000 * 60 * 60 * 24 * 30) } }) ); const PORT = process.env.PORT || 3001; app.listen(PORT, (err) => { if (err) { process.exit(1); } console.log(`Service is running at port ${PORT}`); });
解决方案
方案1:改用原生ES模块(推荐)
connect-redis 7.x为纯ES模块,搭配Node原生ES模块支持可彻底解决版本兼容问题:
- 修改
package.json:- 添加
"type": "module"字段 - 删除
esm依赖,更新redis到4.x版本(connect-redis 7.x要求redis客户端为4.x+) - 调整启动脚本,移除
-r esm参数:{ "type": "module", "scripts": { "server": "node server.js", "dev": "nodemon server.js" } }
- 添加
- 调整
server.js中redis客户端初始化代码(适配redis 4.x API):// 替换原createClient调用 let redisClient = createClient({ url: `redis://${redisHost}:${redisPort}` }); - 重新安装依赖:
npm install
方案2:降级connect-redis到CommonJS兼容版本
如果不想切换到原生ES模块,可降级connect-redis到6.x版本(支持CommonJS):
- 安装兼容版本:
npm uninstall connect-redis && npm install connect-redis@6.1.3 - 调整
server.js中RedisStore的导入方式(适配connect-redis 6.x):// 替换原RedisStore导入 import connectRedis from 'connect-redis'; const RedisStore = connectRedis(expressSession); - 保持原有启动脚本和redis 3.x版本不变,重新启动服务即可。
内容的提问来源于stack exchange,提问作者Md. Nazmul Haque Sarker
相关产品推荐
相关产品推荐

