提问人:Md. Nazmul Haque Sarker 提问时间:11/16/2023 更新时间:11/16/2023 访问量:7
connect-redis 7.0.1 出现错误 [ERR_REQUIRE_ESM]
Getting Error [ERR_REQUIRE_ESM] for connect-redis 7.0.1
问:
节点版本: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}`);
});
答:
0赞
morganney
11/23/2023
#1
看起来您想使用 ESM,因此请使用 Node.js 版本提供的本机支持。
- 卸载软件包。
esm
- 在 package.json 文件中设置。
"type": "module"
- 从 npm 脚本中删除。
-r esm
- 重命名您的相对导入以包含扩展名,例如 .
.js
import 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 模块的依赖并使用。esm
esm
评论