connect-mongo报MongoStore调用TypeError的原因与解决方法
报错TypeError: Class constructor MongoStore cannot be invoked without 'new'是版本适配问题:你当前安装的是v4及以上版本的connect-mongo,该版本重构了API,不再支持v3及更早版本中require("connect-mongo")(session)的链式导入写法,新版本导出的是ES6类,无法直接作为函数调用。
两种方案二选一即可,推荐优先使用新版API适配方案,旧版本已停止维护。
- 方案1:适配新版connect-mongo API
- 修改导入语句,删除旧的链式传参写法,替换为:
const MongoStore = require('connect-mongo');- 修改会话存储实例的创建逻辑,新版使用官方提供的
create静态方法创建实例,数据库地址字段改为mongoUrl,移除原本写在store配置中冗余的secret字段(该字段只需在session配置中声明一次):
适配完成后的完整代码如下:const store = MongoStore.create({ mongoUrl: dbUrl, touchAfter: 24 * 60 * 60 })
const session = require('express-session');
const MongoStore = require('connect-mongo');
const mongoose = require('mongoose');
mongoose.connect(dbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true
});
const store = MongoStore.create({
mongoUrl: dbUrl,
touchAfter: 24 * 60 * 60
})
const sessionConfig = {
store,
name: 'session',
secret: 'thisshouldbeabettersecret!',
resave: false,
saveUninitialized: true,
cookie: {
httpOnly: true,
// secure: true,
expires: Date.now() + 1000 * 60 * 60 * 24 * 7,
maxAge: 1000 * 60 * 60 * 24 * 7
}
}
app.use(session(sessionConfig));
- 方案2:降级connect-mongo到兼容旧写法的版本 如果不想修改现有代码,直接在项目目录执行以下命令安装v3最终版本即可: ```bash npm install connect-mongo@3.2.0
内容的提问来源于stack exchange,提问作者Aarush 01

