【问题标题】:Error: Cannot init client | mongo-connect express-session错误:无法初始化客户端 | mongo-connect 快速会话
【发布时间】:2021-05-28 23:51:15
【问题描述】:

尝试在 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

不知道我错过了什么。

请帮忙。

提前致谢。

伊尔凡。

【问题讨论】:

    标签: mongodb express-session connect-mongo


    【解决方案1】:

    还有一个 npm 包 connect-mongodb-session, https://www.npmjs.com/package/connect-mongodb-session 安装它,它应该可以工作。

    const MongoDBStore = require('connect-mongodb-session')(session);

    【讨论】:

      【解决方案2】:

      以下内容对我有用。

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

      【讨论】:

        【解决方案3】:

        这是最新的解决方案

        添加这行

        第一

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

        【讨论】:

          【解决方案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

          【讨论】:

          • 在您提供的解决方案中,应用程序会为会话处理程序创建一个额外的连接,而不是使用现有的连接。
          • @elMeroMero 我看不出你指的是什么,哪里有额外的连接?
          • 我假设 Irfan 使用 mongoose 在他的项目中保存数据。 ``` store: new MongoStore({ mongooseConnection: mongoose.connection }),``` 的旧方法允许他使用应用程序在其他地方使用的已经存在的连接用于会话存储。现在通过将其替换为store: MongoStore.create({ mongoUrl: process.env.MONGO_URI }),,您基本上是在要求 connect-mongo 从头开始​​创建一个新连接 - 导致两个连接..
          • 这不是正确的解决方案,因为它促进了多个连接到 mongodb 1. By mongodb.connect 2. By MongoStore.create @elMeroMero 也提出了相同的建议
          • 现在在更新的Migration guide of mongo-connect 中有一个解决方案:“要重用现有的 mongoose 连接,请使用 Connection.prototype.getClient() 从您的 mongoose 连接中检索 mongoDb 驱动程序并将其传递给存储在客户端选项。”
          猜你喜欢
          • 2022-01-09
          • 2015-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多