问题描述
尝试在 mongodb 上保存会话时出错。这是我的代码..
const express = require("express");
const session = require("express-session");
const MongoStore = require("connect-mongo").default;
const app = express();
let sessionoptions = session({
secret: "JavaScript is cool",store: MongoStore.create({ client: require("./db") }),resave: false,saveUninitialized: false,cookie: { maxAge: 1000 * 60 * 60 * 24,httpOnly: true },});
app.use(sessionoptions);
const router = require("./router");
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use(express.static("public"));
app.set("views","views");
app.set("view engine","ejs");
app.use("/",router);
module.exports = app;
和 db.js
const dotenv = require("dotenv");
dotenv.config();
const mongodb = require("mongodb");
mongodb.connect(
process.env.CONNECTIONSTRING,{ useNewUrlParser: true,useUnifiedTopology: true },(err,client) => {
module.exports = client;
const app = require("./app");
app.listen(process.env.PORT);
}
);
Assertion Failed: You must provide either mongoUr|clientPromise in options
/home/irfan/Desktop/Brad_Sciff/Complex_App/node_modules/connect-mongo/build/main/lib/MongoStore.js:121
throw new Error('Cannot init client');
^
Error: Cannot init client
at new MongoStore (/home/irfan/Desktop/Brad_Sciff/Complex_App/node_modules/connect-mongo/build/main/lib/MongoStore.js:121:19)
at Function.create (/home/irfan/Desktop/Brad_Sciff/Complex_App/node_modules/connect-mongo/build/main/lib/MongoStore.js:137:16)
at Object.<anonymous> (/home/irfan/Desktop/Brad_Sciff/Complex_App/app.js:9:21)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
我尝试从 const MongoStore = require("connect-mongo").default 更改为 const MongoStore = require("connect-mongo")(session)
const MongoStore = require("connect-mongo")(session);
^
TypeError: require(...) is not a function
at Object.<anonymous> (/home/irfan/Desktop/Brad_Sciff/Complex_App/app.js:4:44)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at mongodb.connect (/home/irfan/Desktop/Brad_Sciff/Complex_App/db.js:10:17)
at /home/irfan/Desktop/Brad_Sciff/Complex_App/node_modules/mongodb/lib/utils.js:693:5
使用 Connect-mongo 4.2,express-session 1.17.1 express 4.17.1 mongodb 3.6.4
不知道我错过了什么。
请帮忙。
提前致谢。
伊尔凡。
解决方法
看来 connect-mongo
最近已更新。我今天也遇到了这个问题,这是我解决它的方法。
过去如何:
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
app.use(
session({
...options
store: new MongoStore({ mongooseConnection: mongoose.connection }),})
);
现在怎么样了:
const session = require('express-session');
const MongoStore = require('connect-mongo').default;
app.use(
session({
store: MongoStore.create({ mongoUrl: process.env.MONGO_URI }),...options
})
);
尝试将您的连接字符串传递给 mongoURL
而不是 client
,看看是否有帮助。
您可以阅读有关 connect-mongo in their docs 的更多信息。
,以下对我有用。
const mongoose = require("mongoose");
const session = require("express-session");
const MongoStore = require("connect-mongo");
const url = 'mongodb://localhost/mydb';
mongoose.connect(url,{ useNewUrlParser: true,useCreateIndex: true,useUnifiedTopology: true,useFindAndModify: true });
const connection = mongoose.connection;
connection.once('open',() => {
console.log("database connected successfully...");
}).catch(err => {
console.log("connection failed...");
});
// session store
let store = new MongoStore({
mongoUrl: url,collection: "sessions"
});
// session config
app.use(session({
secret: process.env.COOKIE_SECRET,resave: false,store: store,saveUninitialized: false,cookie: { maxAge: 1000 * 60 * 60 * 24 },// 24 hours
}));
,
这是最新的解决方案
添加这一行
第一
var session = require('express-session');
var MongoStore = require ('connect-mongo');
第二
app.use(session(
{
secret: '**something** like mysupersecret',store: MongoStore.create({
mongoUrl: '**your url**like mongodb://localhost/test-app'}),}));