connect-redis 7.0.1 出现错误 [ERR_REQUIRE_ESM]

Getting Error [ERR_REQUIRE_ESM] for connect-redis 7.0.1

提问人:Md. Nazmul Haque Sarker 提问时间:11/16/2023 更新时间:11/16/2023 访问量:7

问:

节点版本:16.20.2 connect-redis 版本:7.0.1 ESM 版本:3.2.25 Redis 版本:3.0.2 Express-Session 版本:1.17.3

我在我的节点应用程序中收到ERR_REQUIRE_ESM错误。我尝试为 redis、connect-redis 和 esm 安装不同版本。但对我没有任何作用。请帮我解决。为了让您更好地理解,我在这里分享相关代码块。connect-redis

错误:

/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"
  }
}

我的服务器.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}`);  
});

Express Redis ES6-modules connect-redis

评论


答:

0赞 morganney 11/23/2023 #1

看起来您想使用 ESM,因此请使用 Node.js 版本提供的本机支持。

  1. 卸载软件包。esm
  2. 在 package.json 文件中设置。"type": "module"
  3. 从 npm 脚本中删除。-r esm
  4. 重命名您的相对导入以包含扩展名,例如 ..jsimport connectDB from './config/db.js';

现在尝试运行 dev 。npm run dev

您可以在 GitHub 上的 busmap 存储库中看到使用 ESM 的工作示例。connect-redis

评论

0赞 Md. Nazmul Haque Sarker 12/6/2023
我理解你的解决方案。但我过去常常避免在文件路径的末尾。esm.js
0赞 morganney 12/6/2023
为什么?我认为允许这是一种反模式,因为 ES 模块要求存在文件扩展名。例如,在 Node.js: nodejs.org/api/esm.html#mandatory-file-extensions。此外,当使用相对说明符时,扩展是强制性的: nodejs.org/api/esm.html#import-specifiers 您应该通过添加扩展来删除对本机 ES 模块的依赖并使用。esmesm