Mongodb 错误:无法初始化客户端| mongo connect express会话

Mongodb 错误:无法初始化客户端| mongo connect express会话,mongodb,express-session,connect-mongo,Mongodb,Express Session,Connect Mongo,尝试在mongodb上保存会话时出错。这是我的密码 const express = require("express"); const session = require("express-session"); const MongoStore = require("connect-mongo").default; const app = express(); let sessionOptions = session({ secr

尝试在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)
断言失败:您必须在选项中提供mongoUr | clientPromise
/home/irfan/Desktop/Brad_Sciff/Complex_App/node_modules/connect mongo/build/main/lib/MongoStore.js:121
抛出新错误(“无法初始化客户端”);
^
错误:无法初始化客户端
在新的MongoStore(/home/irfan/Desktop/Brad_Sciff/Complex_App/node_modules/connect mongo/build/main/lib/MongoStore.js:121:19)
在Function.create(/home/irfan/Desktop/Brad_Sciff/Complex_App/node_modules/connect mongo/build/main/lib/MongoStore.js:137:16)
反对。(/home/irfan/Desktop/Brad_Sciff/Complex_App/App.js:9:21)
at模块编译(内部/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:789:10)
at Module.load(内部/modules/cjs/loader.js:653:32)
在tryModuleLoad(内部/modules/cjs/loader.js:593:12)
at Function.Module._load(内部/modules/cjs/loader.js:585:3)
at Module.require(内部/modules/cjs/loader.js:692:17)
根据需要(内部/modules/cjs/helpers.js:25:18)
我试图从const MongoStore=require(“连接mongo”)。默认设置更改为const MongoStore=require(“连接mongo”)(会话)

但是错误正在显现

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
const MongoStore=require(“连接mongo”)(会话);
^
TypeError:require(…)不是函数
反对。(/home/irfan/Desktop/Brad_Sciff/Complex_App/App.js:4:44)
at模块编译(内部/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:789:10)
at Module.load(内部/modules/cjs/loader.js:653:32)
在tryModuleLoad(内部/modules/cjs/loader.js:593:12)
at Function.Module._load(内部/modules/cjs/loader.js:585:3)
at Module.require(内部/modules/cjs/loader.js:692:17)
根据需要(内部/modules/cjs/helpers.js:25:18)
在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

不知道我错过了什么

请帮忙

提前谢谢


Irfan.

所以它看起来像是最近更新了
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的更多信息。

这是最新的解决方案

添加此行

首先

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'}),
        
      }));

在您提供的解决方案中,应用程序为会话处理程序创建了一个额外的连接,而不是使用现有的连接。@elMeroMero我不明白您指的是什么,哪里有额外的连接?我假设Irfan使用mongoose在他的项目中保存数据。“store:new MongoStore({mongooseConnection:mongoose.connection})”的旧方法允许他将应用程序在其他地方使用的现有连接也用于会话存储。现在,将其替换为
store:MongoStore.create({mongoUrl:process.env.MONGO_URI}),
基本上是要求connect MONGO从头开始创建一个新连接-导致两个连接。这不是正确的解决方案,因为它促进了到mongodb 1的多个连接。通过mongodb.connect 2。通过MongoStore.create@elMeroMero还建议sameThere现在是更新版中的一个解决方案:“要重用现有的mongoose连接,请使用connection.prototype.getClient()从mongoose连接中检索mongoDb驱动程序,并将其传递到客户机选项中的存储。”