如何设置 useMongoClient (Mongoose 4.11.0)?

Posted

技术标签:

【中文标题】如何设置 useMongoClient (Mongoose 4.11.0)?【英文标题】:How to set useMongoClient (Mongoose 4.11.0)? 【发布时间】:2017-11-28 16:51:18 【问题描述】:

这是我用来连接数据库的代码:

private connectDatabase(databaseUri: string): Promise<Mongoose.Connection> 
    return Mongoose.connect(databaseUri).then(() => 
        debug('Connected to MongoDB at %O', databaseUri);
        return Mongoose.connection;
    );

今天我将 Mongoose 更新到 4.11.0 版,运行测试时收到此警告:

(node:4138) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0,
use `openUri()` instead, or set the `useMongoClient` option if using `connect()`
or `createConnection()`

我找不到任何关于如何“设置 useMongoClient”的信息。

你们知道怎么做吗?

【问题讨论】:

github.com/Automattic/mongoose/issues/5399 等待修复。谢谢@robertklep。 安装 4.10.8 没有问题。请考虑将 npm install mongoose --save 更改为默认 4.10.8 直到 11 稳定。 不行。它固定在这里:link 【参考方案1】:

这就是你使用 useMongoClient 的方式:

mongoose.connect('mongodb://localhost/advisorDemoTestDB',  useMongoClient: true )

【讨论】:

vscode 告诉我:Argument of type ' useMongoClient: boolean; ' 不能分配给类型为 '(err: MongoError) => void' 的参数。对象字面量只能指定已知属性,并且类型 '(err: MongoError) => void' 中不存在 'useMongoClient'。 刚刚看到@robertklep 评论他离开了你。似乎使用 useMongoClient 也不起作用。我们现在只需要等待那个错误或回滚到 4.10.8 版本。 我尝试使用useMongoClient: true 并解决了该错误,但所有模型方法都不起作用,如果我使用Model.find(),Promise 将保持挂起状态并且没有任何反应。 等待此错误修复或回滚到上一版本 @TiagoBértolo 这肯定是正确答案:)【参考方案2】:

添加 useMongoClient: true 作为 connect 或 createConnection 方法的另一个参数,这取决于您使用的 mongoose 版本。

// Using `mongoose.connect`...
var promise = mongoose.connect('mongodb://localhost/myapp', 
  useMongoClient: true,
  /* other options */
);
// Or `createConnection`
var promise = mongoose.createConnection('mongodb://localhost/myapp', 
  useMongoClient: true,
  /* other options */
);

【讨论】:

useMongoClient 做什么?【参考方案3】:
mongoose.connection.openUri('mongodb://127.0.0.1/camp_v12')

有人试过吗?当我使用它时,我不推荐使用的警告消失了,它来自文档

http://mongoosejs.com/docs/connections.html

【讨论】:

不行。它固定在这里:link【参考方案4】:

最简单的解决方法是打开终端,将目录更改为根项目(package.json 所在的文件夹)

运行:npm remove mongoose

然后:

npm install mongoose@4.10.8 --save

问题解决了。

升级并不总是最好的选择。

http://mongoosejs.com/docs/connections.html

【讨论】:

这不是修复,而是暂时忽略问题的一种方式。 这完全不是解决办法【参考方案5】:

如果没有 Typescript,您几乎可以忽略该问题并使用 Mongoose.connect(databaseUri, useMongoClient: true )

如果您真的想避免出现警告,请避免使用 4.11.0 版本。

我更新到版本 4.11.1,由于 @types/mongoose@4.7.18 尚未更新,并且他们没有在 ConnectionOptions 中提及字段 useMongoClient,这就是我导入模块的方式:

const Mongoose = require('mongoose');

然后使用了这个函数:

private connectDatabase(databaseUri: string): Promise<any> 
    return Mongoose.connect(databaseUri,  useMongoClient: true )
        .then(() => 
            console.log('Connected to MongoDB at ', databaseUri);
            return Mongoose.connection;
        )
        .catch(err => debug(`Database connection error: $err.message`));

【讨论】:

【参考方案6】:

正如许多答案所说,在connectcreateConnection 方法的选项参数中添加 useMongoClient: true 将解决问题。

例如

// With mongoose.connect method
mongoose.connect('mongodb://localhost/app',  useMongoClient: true );

// With createConnection method
mongoose.createConnection('mongodb://localhost/app',  useMongoClient: true );

但 MongoClient 到底是什么?

从 MongoDB Node.js 驱动程序版本 1.2 开始,引入了一个新的连接类 MongoClient,它在所有官方驱动程序中都具有相同的名称。

新的连接类 MongoClient 确认所有对 MongoDB 的写入,与关闭确认的现有 DB 连接类不同。

所以 useMongoClient: true 告诉moongoose 使用新的连接类而不是旧的连接类

欲了解更多信息click here

【讨论】:

【参考方案7】:

使用 Mongoose 4.11.x 连接到 MongoDB(使用 mLab 单实例和 MongoDB Atlas 副本集进行测试):

const mongoose = require('mongoose'); 猫鼬.Promise = global.Promise; 常量选项 = promiseLibrary: global.Promise, 使用MongoClient:真, ; 函数连接() mongoose.connect(URI,选项) .then(函数() const admin = new mongoose.mongo.Admin(mongoose.connection.db); admin.buildInfo(函数(错误,信息) 如果(错误) console.err(`获取 MongoDB 信息时出错:$err`); 别的 console.log(`连接到 MongoDB (版本 $info.version) 成功打开!`); ); ) .catch((err) => console.error(`连接到 MongoDB 时出错:$err`)); module.exports = 连接;

创建模型:

const mongoose = require('mongoose'); const userSchema = new mongoose.Schema(...); module.exports = mongoose.model('User', userSchema);

【讨论】:

【参考方案8】:

根据mongoosedocumentation,可以这样设置useMongoClient

function connectDatabase(databaseUri)
    var promise = mongoose.connect('mongodb://localhost/myapp', 
        useMongoClient: true,
    );
    return promise;

【讨论】:

【参考方案9】:

最简单的解决方法:

通过终端在项目根文件夹中运行此命令:

npm remove mongoose

npm install mongoose@4.10.8 --save

问题解决了。

升级并不总是最好的选择。

https://github.com/Automattic/mongoose/issues/5399

【讨论】:

【参考方案10】:
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/starbucks',  
    useMongoClient: true 
);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('openUri', function() 
    // we're connected!
);

【讨论】:

请添加一些描述,使回答更有效。【参考方案11】:

错误:

(node:1652) DeprecationWarning:open() 在 mongoose >= 4.11.0 中已弃用,请改用openUri(),或者如果使用connect()createConnection(),请设置useMongoClient 选项。

解决方法:在连接属性中设置useMongoClient:true

var promise = mongoose.connect('mongodb://localhost/myapp', 
  useMongoClient: true,
  /* other options */
);

见http://mongoosejs.com/docs/connections.html#use-mongo-client 现在正在监听请求

【讨论】:

这似乎与所提出的问题完全无关。我认为这是一个自我回答问题的尝试。这不是正确的方法【参考方案12】:

它适用于我使用 Typescript:

var dbOpt : any =  
    useMongoClient: true
 
mongoose.connect(dbURI, dbOpt);

【讨论】:

【参考方案13】:

升级猫鼬,首先你需要用这个代码卸载它:

npm uninstall mongoose

然后使用以下代码再次安装:

npm install mongoose  --save

【讨论】:

以上是关于如何设置 useMongoClient (Mongoose 4.11.0)?的主要内容,如果未能解决你的问题,请参考以下文章

mong 的 安装 和测试

mong 按 geometry 搜索 地理位置信息

unity的mong.data.sqlite.dll 在哪儿

Jenkins创建主从节点

Linux上MongoDB一些设置

mongoose 数据库连接