问题描述
我正在创建一个 Next.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
来解决这个问题。