You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块支持可彻底解决版本兼容问题:

  1. 修改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"
        }
      }
      
  2. 调整server.js中redis客户端初始化代码(适配redis 4.x API):
    // 替换原createClient调用
    let redisClient = createClient({
      url: `redis://${redisHost}:${redisPort}`
    });
    
  3. 重新安装依赖:npm install

方案2:降级connect-redis到CommonJS兼容版本

如果不想切换到原生ES模块,可降级connect-redis到6.x版本(支持CommonJS):

  1. 安装兼容版本:
    npm uninstall connect-redis && npm install connect-redis@6.1.3
    
  2. 调整server.js中RedisStore的导入方式(适配connect-redis 6.x):
    // 替换原RedisStore导入
    import connectRedis from 'connect-redis';
    const RedisStore = connectRedis(expressSession);
    
  3. 保持原有启动脚本和redis 3.x版本不变,重新启动服务即可。

内容的提问来源于stack exchange,提问作者Md. Nazmul Haque Sarker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:44:52