类型错误:类构造函数 MongoStore 不能在没有“new”的情况下被调用

问题描述

我正在创建一个 Next.js 网络应用......

在服务器文件夹内的 app.js 文件中,我有以下代码

const express = require("express");
const next = require("next");

const expressValidator = require("express-validator");
const mongoose = require("mongoose");
const passport = require("passport");
const mongoSessionStore = require("connect-mongo");
const session = require("express-session");

/* Loads all variables from .env file to "process.env" */
// npm instsall dotenv
// require("dotenv").config();

require("./models/Listing");
require("./models/User");

const routes = require("./routes");

const dev = process.env.NODE_ENV !== "production";
const port = process.env.PORT || 3000;
const ROOT_URL = dev ? `http://localhost:${port}` : process.env.PRODUCTION_URL;
const app = next({ dev });
const handle = app.getRequestHandler();

const mongooSEOptions = {
    useNewUrlParser: true,useCreateIndex: true,useFindAndModify: false,useUnifiedTopology: true
};

mongoose
    .connect(
        process.env.MONGODB_URI,mongooSEOptions
    )
    .then(() => console.log("DB connected"));

mongoose.connection.on("error",err => {
    console.log(`DB connection error: ${err.message}`);
});

app.prepare().then(() => {
    const server = express();

    if(!dev) {
        /* Helmet helps secure our app by setting varIoUs HTTP headers */
        server.use(helmet());
        /* Compression gives us gzip compression */
        server.use(compression());
    }

    /* Body Parser built-in to Express as of version 4.16 */
    server.use(express.json());

    /* Express Validator will validate form data sent to the backend */
    // server.use(expressValidator());

    /* apply routes from the "routes" folder */
    server.use("/",routes);

    /* give all Next.js's requests to Next.js server */
    server.get("/_next/*",(req,res) => {
        handle(req,res);
    });

    server.get("/static/*",res);
    });

    const MongoStore = mongoSessionStore(session);
    const sessionConfig = {
        name: "next-connect.sid",// secret used for using signed cookies w/ the session
        secret: process.env.SESSION_SECRET,store: new MongoStore({
          mongooseConnection: mongoose.connection,ttl: 14 * 24 * 60 * 60 // save session for 14 days
        }),// forces the session to be saved back to the store
        resave: false,// don't save unmodified sessions
        saveUninitialized: false,cookie: {
          httpOnly: true,maxAge: 1000 * 60 * 60 * 24 * 14 // expires in 14 days
        }
      };

    if (!dev) {
    sessionConfig.cookie.secure = true; // serve secure cookies in production environment
    server.set("trust proxy",1); // trust first proxy
    }

    /* Apply our session configuration to express-session */
    server.use(session(sessionConfig));

    /* Add passport middleware to set passport up */
    server.use(passport.initialize());
    server.use(passport.session());

    server.use((req,res,next) => {
        /* custom middleware to put our user data (from passport) on the req.user so we can access it as such anywhere in our app */
        res.locals.user = req.user || null;
        next();
    });


    server.get("*",res);
    });
        
    server.listen(port,err => {
        if (err) throw err;
        console.log(`Server listening on ${ROOT_URL}`);
    });
    
})

出于某种原因,当我运行上述代码时出现以下错误

UnhandledPromiseRejectionWarning: TypeError: Class constructor 没有'new'就不能调用MongoStore

似乎产生该错误的行似乎是:

const MongoStore = mongoSessionStore(session);

这是什么原因造成的,我该如何解决

解决方法

看起来 'mongoSessionStore' 是一个类构造函数。
一个类有关于如何为会话创建一个新对象的说明。这发生在构造函数中。

也许如果你只是在 mongoSessionStore 前加上“new”这个词,它会起作用吗?
这样 Mongo 将为开始的会话创建一个 new 对象。

,

所以事实证明我正在复制的代码使用的是 connect-mongo ^2.0.1 但我在 package.json 中的 connect-mongo 是 ^4.4.0

所以我需要将适合的代码从原始版本更改为新版本......这就是我最后得到的:

const sessionConfig = {
        name: "next-connect.sid",// secret used for using signed cookies w/ the session
        secret: process.env.SESSION_SECRET,resave: false,saveUninitialized: false,store: MongoStore.create({
            mongoUrl: process.env.MONGODB_URI,mongooseConnection: mongoose.connection,ttl: 14 * 24 * 60 * 60 // save session for 14 days
        }),cookie: {
            httpOnly: true,maxAge: 1000 * 60 * 60 * 24 * 14 // expires in 14 days
        }
    }

    if (!dev) {
        sessionConfig.cookie.secure = true; // serve secure cookies in production environment
        server.set("trust proxy",1); // trust first proxy
    }


    /* Apply our session configuration to express-session */
    server.use(session(sessionConfig));

到目前为止我认为它工作正常......

,

可能是因为您使用的是connect-mongo@v4,您可以尝试使用npm i connect-mongo@3.2.0 --save来解决这个问题。