express-session搭配connect-mongo 4.x使用报con.db is not a function错如何解决
问题原因
这个报错是因为你给MongoStore.create()传入的client参数不符合connect-mongo 4.x的要求:client参数需要接收MongoDB原生驱动的MongoClient实例,而你传入的是Mongoose的connection对象,二者类型不匹配,导致内部调用con.db()方法失败。
解决方案
有两种常用的正确配置方式,选择其中一种即可:
方案1:使用Mongoose专属配置项(适配你当前的代码结构,操作最简单)
把原来的client: connection替换为mongooseConnection: connection,这是connect-mongo 4.x专门为Mongoose用户提供的参数,直接接收Mongoose的连接对象即可。
修改后的完整代码:
const MongoStore = require('connect-mongo'); const connectDB = require('./config/db'); const { connection } = require('mongoose'); app.use( session({ secret: 'some secret', resave: false, saveUninitialized: true, store: MongoStore.create({ // 替换为mongooseConnection参数 mongooseConnection: connection, // 可选配置:指定session存储的集合名,默认值为sessions collectionName: 'sessions' }), cookie: { maxAge: 1000 * 60 * 60 * 24, }, }) );
方案2:直接传入MongoDB连接字符串
如果不需要复用现有Mongoose连接,也可以直接传入mongoUrl参数,connect-mongo会自行创建数据库连接,不需要额外引入Mongoose的连接对象:
store: MongoStore.create({ mongoUrl: '你的MongoDB连接地址,示例:mongodb://localhost:27017/你的数据库名', collectionName: 'sessions' })
注意事项
确保Mongoose的连接已经成功建立之后再初始化session中间件,避免出现连接未就绪的异常。如果你的connectDB是异步初始化的,可以在数据库连接成功的回调里再挂载session中间件。
内容的提问来源于stack exchange,提问作者Tezz Bhandari
相关产品推荐
相关产品推荐

