【问题标题】:TypeError: Class constructor MongoStore cannot be invoked without 'new'TypeError:没有'new'就不能调用类构造函数MongoStore
【发布时间】:2021-08-14 13:04:35
【问题描述】:

我正在创建一个 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/*", (req, res) => {
        handle(req, 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("*", (req, res) => {
        handle(req, res);
    });
        
    server.listen(port, err => {
        if (err) throw err;
        console.log(`Server listening on ${ROOT_URL}`);
    });
    
})

由于某种原因,我在运行上述代码时收到以下错误:

UnhandledPromiseRejectionWarning:TypeError:类构造函数 没有'new'就不能调用MongoStore

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

const MongoStore = mongoSessionStore(session);

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

【问题讨论】:

标签: javascript mongodb session next.js connect-mongo


【解决方案1】:

我在我的应用程序中遇到了同样的问题,因为我已将 connect-mongo 更新到最新版本 (4.1)。我通过卸载现有的 connect-mongo 包并重新安装版本 3.1.2 解决了这个问题。 您可以通过键入以下命令来简单地安装版本:

npm install connect-mongo@3.1.2

或者您复制以下命令并在键入命令 npm install 后粘贴到您的 .json 文件中以更改版本:

"connect-mongo": "^3.1.2",

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      事实证明,我复制的代码使用的是 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));
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2018-11-12
          • 2019-04-21
          • 2021-05-17
          • 2021-12-27
          • 1970-01-01
          • 1970-01-01
          • 2020-01-04
          • 2021-05-24
          • 2020-11-27
          相关资源
          最近更新 更多