Express中connectRedis不是函数报错,已降级v6解决求问错误原因
运行环境
Ubuntu Mate 22.04.2 lts Node 18.16.0 Redis 7.0.11 - 无密码(无需认证),ping-pong测试通过 "body-parser": "^1.20.2" "connect-redis": "^7.1.0" "cors": "^2.8.5" "dotenv": "^16.3.1" "express": "^4.18.2" "express-session": "^1.17.3" "redis": "^4.6.7"
问题情况
我尝试运行两个Node.js Redis会话存储示例,均出现错误:
- 第一个示例运行后报错:
const redisStore = require('connect-redis')(session); ^ TypeError: require(...) is not a function at Object.<anonymous> (/home/dol/MyPrograms/redis03/index.js:19:44) at Module._compile (node:internal/modules/cjs/loader:1254:14) at Module._extensions..js (node:internal/modules/cjs/loader:1308:10) at Module.load (node:internal/modules/cjs/loader:1117:32) at Module._load (node:internal/modules/cjs/loader:958:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:23:47
- 第二个示例运行后报错:
const RedisStore = connectRedis(session) ^ TypeError: connectRedis is not a function at Object.<anonymous> (/home/dol/MyPrograms/redis01/index.js:11:20) at Module._compile (node:internal/modules/cjs/loader:1254:14) at Module._extensions..js (node:internal/modules/cjs/loader:1308:10) at Module.load (node:internal/modules/cjs/loader:1117:32) at Module._load (node:internal/modules/cjs/loader:958:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:23:47
我已经通过安装connect-redis 6版本替代7版本解决了问题,但不清楚v7版本出错的原因,特此求助:到底是哪里操作错了?
问题原因与解决方法
connect-redis从v7版本开始,导出方式发生了根本性变化:
- v6及更早版本:包直接导出一个可调用的工厂函数,所以可以用
const redisStore = require('connect-redis')(session)这类写法直接生成存储实例 - v7版本:改用ES模块风格导出,默认导出的是
RedisStore类。在CommonJS环境(使用require)下,需要通过.default属性获取这个类,正确写法如下:
const RedisStore = require('connect-redis').default; // 假设你已经创建了Redis客户端实例redisClient const store = new RedisStore({ client: redisClient, session: session });
如果你的项目支持ES模块(将文件后缀改为.mjs,或者在package.json中设置"type": "module"),也可以用import语法:
import RedisStore from 'connect-redis'; import session from 'express-session'; const store = new RedisStore({ client: redisClient, session: session });
你之前使用的示例都是基于connect-redis v6的旧写法,直接套用在v7上就会因为导出结构不匹配,导致require(...)不是函数的错误。
内容的提问来源于stack exchange,提问作者Doleensk
相关产品推荐
相关产品推荐

