MongoStore:无法初始化客户端.不接受猫鼬连接对象



我正在尝试使用AWS DocumentDB(AWS品牌的MongoDB(来帮助我存储会话数据。我已经通过mongoose成功地连接到了db.js文件中的数据库。

当我试图将这个mongose连接作为MongoStore构造函数中的mongoseConnection参数传递给时,我得到了以下错误:

Assertion failed: You must provide either mongoUrl|clientPromise|client in options
xxxx/node_modules/connect-mongo/build/main/lib/MongoStore.js:119
throw new Error('Cannot init client. Please provide correct options');
^
Error: Cannot init client. Please provide correct options

我的db.js看起来是这样的:

import * as fs from 'fs';
import mongoose from 'mongoose';
var ca = [fs.readFileSync("./certs/rds-combined-ca-bundle.pem")];  // AWS-provided cert
var connectionOptions = {
useUnifiedTopology: true,
useNewUrlParser: true,
ssl: true,
sslValidate: true,
checkServerIdentity: false,
sslCA: ca,
replicaSet: 'rs0',
readPreference: 'secondaryPreferred',
retryWrites: false
};
var connectionString = 'mongodb://' + user + ':' + pwd + '@' + dbServerLocation + '/' + dbName;  // variables defined elsewhere and removed from this post.
mongoose.connect(connectionString, connectionOptions)
.catch((err) => console.log(err));
}
export default mongoose.connection;

而我的server.js(main(抛出的错误看起来是这样的:

import db from './db/db.js';
import session from 'express-session';
import MongoStore from 'connect-mongo';
db.on('error', () => console.error('MongoDB connection error.'));
db.on('reconnectFailed', () => console.error("Reconnection attempts to DB failed."));
db.on('connected', () => { console.log('Connected to DocumentDB database in AWS') });
import express from 'express';
const sessionStore = new MongoStore({
mongooseConnection: db,
collection: 'sessions'
})
var app = express();
app.use(session({
resave: false,
secret: 'secret word',
saveUninitialized: true,
store: sessionStore,
cookie: {
maxAge: 1000 * 60 * 60 * 24
}
}))

以及应用程序的其余部分。

为了能够将我的猫鼬连接对象用作会话存储,我需要更改什么?

我在其他地方看了看,但像这样的问题表明,我们应该能够发送实际的mongoose连接,而不是重新发送连接字符串并加倍连接:错误:无法初始化客户端|mongo-connect express会话

根据此处的文档,MongoStore构造函数的mongooseConnection参数已更改为"client":https://www.npmjs.com/package/connect-mongo

(我仍然会遇到错误——特别是现在我得到了一个"con.db",它不是MongoStore的函数……但由于它与OP有关,答案是改为"client",而不是"mongooseConnection"。(

对于那些在我之后的人,特别是那些认为自己有mongo连接并希望将其作为client参数传递的人。。。。您需要调用getClient()函数来帮助实现这一点,如下所示:

const sessionStore = new MongoStore({
client: dbConnection.getClient(),
collectionName: 'sessions'
})

在connect mongo的迁移wiki中找到了以下内容:https://github.com/jdesboeufs/connect-mongo/blob/HEAD/MIGRATION_V4.md

以下是我如何使用此方法设置的:https://github.com/jdesboeufs/connect-mongo/blob/092066300746f3733c0c3dac8cc378407ef5a26c/example/mongoose.js

对我来说很有用。最终成功的关键是,如果你使用Compass ,还可以将"localhost"更改为"127.0.0.1">

const express = require('express');
const mongoose = require('mongoose');
const session = require('express-session');
const MongoStore = require('connect-mongo')
const app = express()
const port = 3000
const dbString = 'mongodb://127.0.0.1:27017';
const dbOptions = { 
useNewUrlParser: true,
useUnifiedTopology: true
}
const conn = mongoose.connect(dbString, dbOptions).then(m => m.connection.getClient());

app.use(express.json());
app.use(express.urlencoded({extended: true}));
const sessionStore = MongoStore.create({
clientPromise: conn,
dbName: "session"
})
app.use(session({
secret: 'some secret',
resave: false,
saveUninitialized: true,
store: sessionStore,
cookie: {
maxAge: 1000 * 60 * 60 * 24
}
}))
app.get('/', (req, res, next) => {
res.send('<h1>Hello Bret (sessions)</h1>')
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})

最新更新