更新到5.2.9
版本后,当我启动我的网络应用程序时,我一直在控制台中收到此消息:
DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
而且我都不使用它们。
#6880 的副本
感谢您花时间报告问题@bricss。 Mongoose 在内部调用ensureIndex()
。 您现在可以安全地忽略该警告,或者使用节点标志--no-deprecation
将其静音,或者如果 5.2.9 中没有您依赖的特定修复程序,则降级到 5.2.8。 关注#6880 获取更新👍
,unique: true,index: true 在我的一个模式中的一个字段上,它会触发此警告。 质疑如何在不收到此警告的情况下确保唯一值。
@nonniv升级到 5.2.10 并设置mongoose.set('useCreateIndex', true);
升级到 5.2.10 版本后。 以下任何选项都应该停止警告?
js
mongoose.connect(config.dbUri, {
useCreateIndex: true,
useNewUrlParser: true
})
或者js
mongoose.set('useCreateIndex', true)
mongoose.connect(config.dbUri, { useNewUrlParser: true })
它在这里不起作用。 (对不起,如果我做错了什么)
@samuelcecilio您看到了哪些具体的弃用警告? 打开 #6922 的评论中有一些有用的注释,或者随时在这里分享您的具体警告,我会看看是否可以提供帮助。
(node:9125) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
@samuelcecilio mongoose.set('useCreateIndex', true)
应该停止该警告,如下例所示:
#!/usr/bin/env node
'use strict';
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);
const conn = mongoose.connection;
const Schema = mongoose.Schema;
const schema = new Schema({
name: {
type: String,
unique: true
}
});
const Test = mongoose.model('test', schema);
const test = new Test({ name: 'one' });
async function run() {
console.log(`mongoose version: ${mongoose.version}`);
await conn.dropDatabase();
await test.save();
return conn.close();
}
run();
issues: ./6922.js
mongoose version: 5.2.10
issues:
您确定您的项目使用的是 5.2.10 吗? 您的项目中是否还有其他使用其他版本的猫鼬等的软件包?
嗨,谢谢回复。 是的,我检查了 3 次版本,哈哈:
$ npm list --depth=0
...
[email protected]
...
我的代码
应用程序.js
````js
...
const config = require('./config')
const mongoose = require('mongoose')
常量表达 = 要求('表达')
常量应用程序 = 快递()
mongoose.connect(config.dbUri, { useNewUrlParser: true })
mongoose.set('useCreateIndex', true)
……
module.exports = 应用
````
斌/万维网
````js
const app = require('../app')
const config = require('../config')
const debug = require('debug')('blitz')
常量 http = 要求('http')
常量端口 = normalizePort(process.env.PORT || config.port)
const mongoose = require('mongoose')
app.set('端口', 端口)
常量服务器 = http.createServer(app)
server.listen(端口)
server.on('error', onError)
server.on('监听', onListening)
const mongo = mongoose.connection
mongo.on('error', error => { debug('mongo: ' + error.name) })
mongo.on('connected', () => { debug('mongo: Connected') })
mongo.on('disconnected', () => { debug('mongo: Disconnected') })
……
````
当我运行DEBUG=blitz* npm run dev
````重击
nodemon bin/www
[节点监视器] 1.18.3
[nodemon]随时重启,输入rs
[nodemon] 观看: 。
[nodemon] 开始node bin/www
blitz 监听端口 3000 +0ms
blitz mongo:已连接 +14ms
(节点:10622)DeprecationWarning:collection.ensureIndex 已弃用。 请改用 createIndexes。
````
@samuelcecilio可能将mongoose.set('useCreateIndex', true)
移动到bin/www
文件? 我将设置一个快速示例并进行测试。
@samuelcecilio在玩了这个之后,我发现我需要在包含模型的路由文件中将 useCreateIndex 设置为 true。 就我而言,使用 express cli 工具后,我需要在如下所示的索引路由中设置 useCreateIndex:
var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
const Test = mongoose.model('test', { name: {type: String, unique: true }});
/* GET home page. */
router.get('/', function(req, res, next) {
Test.create({ name: 'billy' }).then((doc) => {
return res.status(200).json({ done: true, test: doc.id });
}).catch((e) => {
return res.status(500).json({ err: e });
});
});
module.exports = router;
没有在我得到的索引路由中设置的选项:
[nodemon] starting `node bin/www`
version: 5.2.10
(node:17042) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
在我得到的路线中设置选项后:
[nodemon] starting `node bin/www`
version: 5.2.10
^C
我尝试将其设置在 bin/www 中,但这并没有消除警告。 只有在路由中设置它是成功的。
~>: curl localhost:3000/
{"done":true,"test":"5b84a4e13ec72e4352475426"}~>:
~>:
我为用户、客户、供应商、订单、项目使用单独的文件。
这停止了警告:
模型/user.js
````js
const addressSchema = require('./address')
const profileSchema = require('./profile')
const uuidv4 = 要求('uuid/v4')
const mongoose = require('mongoose')
const Schema = mongoose.Schema
mongoose.set('useCreateIndex', true)
const userSchema = new Schema({
禁用:{类型:布尔值,默认值:false},
角色:{类型:数组,默认值:['assistant']},
身份:{类型:字符串,唯一:真,必需:真},
用户名:{类型:字符串,唯一:true,必需:true},
名称:{类型:字符串,大写:true,必需:true},
密码:{类型:字符串,必填:真},
秘密:字符串,
简介:profileSchema,
地址:地址架构,
创建日期,
修改日期
}, {
集合:'用户'
})
userSchema.pre('save', function (next) {
常量文档 = 这个
doc.created = Date.now()
doc.modified = Date.now()
doc.secret = uuidv4()
下一个()
})
module.exports = mongoose.model('User', userSchema)
````
我认为这将是一些全局设置,但显然我必须添加所有文件。
@samuelcecilio ,您可以将猫鼬包装在自定义文件中,例如
const mongoose = require('mongoose')
mongoose.set('useCreateIndex', true);
//etc
module.exports = mongoose
然后需要你的包装器const mongoose = require('myMongoose')
而不是到处都是猫鼬。 当我开始升级到 5.2.8 以上时,这可能是我最终不得不做的事情。
我仍然必须修改所有当前文件。 对于models
文件夹中的每个文件,我会将require ('mongoose')
替换为require('myMongoose')
。 这同样适用于app.js
和bin/www
。
问题是:在mongoose
的未来版本中,我不需要包含mongoose.set ('useCreateIndex', true)
或者这是否正常,因为与旧版本的 mongo、node 等的兼容性问题......?
我怀疑这种行为将保持现在的状态(必须设置变量,而不是它的内部实现),直到猫鼬的下一个主要版本(即6.0.0 )。
现在,我已将mongoose.set('useCreateIndex', true)
添加到所有包含require('mongoose')
的文件中。 我正在考虑使用包装器('./myMongoose')
或('./mongoose-custom')
。 你怎么认为?
这应该是全球性的吗? 这是一个明确的问题吗?
在每个包含模型声明的文件中添加mongoose.set('useCreateIndex', true)
真的很不舒服。
为什么不让它从connect
选项中工作,或者在连接之前设置它?
@samuelcecilio @bricss同意。 重新打开它以调查潜在的解决方案。
你不需要把它放在每个文件中,但不幸的是,现在你需要在任何 mongoose.model() 调用之前放置 mongoose.set('useCreateIndex', true) 。 如果您导出模型而不是模式,那将很棘手。 将为此添加修复程序。
升级到 5.2.13 版后,是否应该停止警告? 谢谢
javascript
mongoose.connect(config.dbUri, {
useCreateIndex: true,
useNewUrlParser: true
})
bash
the options [useCreateIndex] is not supported
server: listening on port 3000 +0ms
mongo: Connected +34ms
(node:18457) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
@samuelcecilio useCreateIndex
不是连接选项,但只要您在调用 $#$2$ mongoose.set('useCreateIndex', true);
之前调用mongoose.model()
(即使在其他文件中),对 mongoose.model 的所有后续调用都应该回退到您使用mongoose.set()
设置的选项。 我用上面的例子测试了 5.2.13,而不是在 bin/www 文件中调用mongoose.set('useCreateIndex', true)
而不是在我的路由中。 现在可以了。
它在连接之后和所有其他文件之前与 5.2.13 一起使用。
这是我的 db.js 文件中的连接:
// Create the database connection
mongoose.connect(encodeMongoURI(dbURI), options);
mongoose.set('useCreateIndex', true);
我在一个单独的脚本中有我的 mongo 连接。 这样我只需调用 mongoose.set('useCreateIndex', true); 在实际连接到 mongo 之前。 那么就没有必要把它放在我的任何模型声明中。
@LucHighwalker的建议是正确的方法。 理想情况下,您将所有这些全局选项放在调用mongoose.connect()
之前。
两者之间是否有任何功能差异
mongoose.connect(encodeMongoURI(dbURI), options);
mongoose.set('useCreateIndex', true);
和
mongoose.set('useCreateIndex', true);
mongoose.connect(encodeMongoURI(dbURI), options);
? 因为两者在 5.2.17 中似乎都可以正常工作
mongoose.connect(config.dbUri, {
useCreateIndex: true,
useNewUrlParser: true
})
适用于最新版本
好的,我猜@types/mongoose 是后面的一些版本(还不能在打字稿上工作)。
mongoose.connect(url, {
useNewUrlParser: true,
autoIndex: false
})
@Dionesio的回答对我有用。 谢谢!
mongoose.connect("mongodb://localhost:27017/test", {useNewUrlParser: true});
mongoose.set('useCreateIndex', true);
这解决了我所有的弃用警告。
@samuelcecilio在玩了这个之后,我发现我需要在包含模型的路由文件中将 useCreateIndex 设置为 true。 就我而言,使用 express cli 工具后,我需要在如下所示的索引路由中设置 useCreateIndex:
var express = require('express'); var router = express.Router(); const mongoose = require('mongoose'); mongoose.set('useCreateIndex', true); const Test = mongoose.model('test', { name: {type: String, unique: true }}); /* GET home page. */ router.get('/', function(req, res, next) { Test.create({ name: 'billy' }).then((doc) => { return res.status(200).json({ done: true, test: doc.id }); }).catch((e) => { return res.status(500).json({ err: e }); }); }); module.exports = router;
没有在我得到的索引路由中设置的选项:
[nodemon] starting `node bin/www` version: 5.2.10 (node:17042) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
在我得到的路线中设置选项后:
[nodemon] starting `node bin/www` version: 5.2.10 ^C
我尝试将其设置在 bin/www 中,但这并没有消除警告。 只有在路由中设置它是成功的。
卷曲 localhost 的输出
~>: curl localhost:3000/ {"done":true,"test":"5b84a4e13ec72e4352475426"}~>: ~>:
谢谢 - 添加 mongoose.set('useCreateIndex', true); 解决了我的问题
我要锁定这个问题。 如需将来参考,请参阅我们文档中的弃用指南
最有用的评论
升级到 5.2.10 版本后。 以下任何选项都应该停止警告?
js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
或者
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
它在这里不起作用。 (对不起,如果我做错了什么)