'Error: Cannot init client | mongo-connect express-session

I am getting error while trying to save session on mongodb. Here is my code..

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;

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

And the error is here..

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)

I tried to change from const MongoStore = require("connect-mongo").default to const MongoStore = require("connect-mongo")(session)

But the error is showing..

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

Using Connect-mongo 4.2, express-session 1.17.1 express 4.17.1 mongodb 3.6.4

Don't know what I am missing.

Please help.

Thanks in Advance.

Irfan.



Solution 1:[1]

So it looks like connect-mongo has been updated recently. I came across this issue today as well and here's how I fixed it.

How it used to be:

const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

app.use(
  session({
    ...options
    store: new MongoStore({ mongooseConnection: mongoose.connection  }),
  })
);

How it is now:

const session = require('express-session');
const MongoStore = require('connect-mongo').default;

app.use(
  session({
    store: MongoStore.create({ mongoUrl: process.env.MONGO_URI }),
    ...options
  })
);

Try passing your connection string into mongoURL instead of client and see if that helps.

You can read more about connect-mongo in their docs.

Solution 2:[2]

the following is worked for me.

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

Solution 3:[3]

what I did was to downgrade from mongodb version 4 to version 3. Hence, in your terminal, uninstall connect-mongo and reinstall lower version.

"npm uninstall connect-mongo"

"npm i connect-mongo@3"

this allows you to be able to pass in your session to the MongoStore.

"const path = require('path')

const express = require('express') 

const mongoose  = require ('mongoose')

const dotenv = require('dotenv')

const morgan = require('morgan')

const exphbs = require ('express-handlebars')

const passport = require('passport')

const session = require ('express-session')

const MongoStore = require('connect-mongo')(session)"

Solution 4:[4]

This is latest solution

add this lines

First

var session = require('express-session');
var MongoStore = require ('connect-mongo');

Second

app.use(session(
      {
        secret: '**something** like mysupersecret',
        store: MongoStore.create({ 
          mongoUrl: '**your url**like mongodb://localhost/test-app'}),
        
      }));

Solution 5:[5]

There is an another npm package connect-mongodb-session, https://www.npmjs.com/package/connect-mongodb-session Install it and it should work.

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Romaan Naeem
Solution 2 Biswajit Mishra
Solution 3 Aqib Javed
Solution 4 sainupangad
Solution 5 Piyush Chandra