DeprecationWarning: Mongoose: the `strictQuery` option will be switched back to `false` by default in Mongoose 7
我只是从我的 app.js 创建一个名为 Fruits 的数据库,并使用 Mongoose 将数据库连接到 MongoDB。
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true});
mongoose.set('strictQuery', false);
const fruitSchema = new mongoose.Schema({
name: String,
rating: Number,
review: String
});
const Fruit = mongoose.model("Fruit", fruitSchema);
const fruit = new Fruit({
name: "Apple",
rating: 7,
review: "Taste Good"
});
fruit.save();
每当我尝试node app.js
时,我都会得到DeprecationWarning。即使我尝试使用mongoose.set('strictQuery', true);
,同样的错误仍然如下:
(node:15848) [MONGOOSE] DeprecationWarning: Mongoose: the `strictQuery` option w
ill be switched back to `false` by default in Mongoose 7. Use `mongoose.set('str
ictQuery', false);` if you want to prepare for this change. Or use `mongoose.set
('strictQuery', true);` to suppress this warning.
(Use `node --trace-deprecation ...` to show where the warning was created)
D:\Web Development\FruitsProject\node_modules\mongoose\lib\drivers\node-mongodb-
native\collection.js:158
const err = new MongooseError(message);
^
MongooseError: Operation `fruits.insertOne()` buffering timed out after 10000ms
at Timeout.<anonymous> (D:\Web Development\FruitsProject\node_modules\mongoo
se\lib\drivers\node-mongodb-native\collection.js:158:23)
at listOnTimeout (node:internal/timers:564:17)
at process.processTimers (node:internal/timers:507:7)
Node.js v18.12.1
然后第二个错误也是继续fruits.insertOne()。
正因为如此,我的MongoDB数据库没有得到更新。
test> show dbs
admin 40.00 KiB
config 108.00 KiB
local 40.00 KiB
shopDB 72.00 KiB
我只是想修复这个错误。但我不知道在哪里修复这个错误。对于错误的第二部分,似乎是来自nodule_modules本身。我怎样才能修复这个错误呢?
mongoose.set("strictQuery", false);
mongoose.connect(process.env.MONGO_URL);
或者
mongoose.set("strictQuery", false);
mongoose.connect(process.env.MONGO_URL, () => {
console.log("Connected to MongoDB");
});
const connectDB = async () => {
try {
mongoose.set('strictQuery', false);
await mongoose.connect(db, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
console.log('MongoDB Connected...');
} catch (err) {
console.error(err.message);
// make the process fail
process.exit(1);
}
我想为现有的答案提供更多的背景。
当strict
选项被设置为true时,Mongoose将确保只有在你的模式中指定的字段才会被保存在数据库中,而所有其他字段都不会被保存(如果其他一些字段被发送的话)。
现在,这个选项是默认启用的,但在Mongoose v7中,它将被改变为false默认。这意味着所有的字段都将被保存在数据库中,即使其中有些字段没有在模式模型中指定。
因此,如果你想拥有严格的模式,并在数据库中只存储你的模型中指定的内容,从Mongoose v7开始,你将不得不手动将strict
选项设置为true。
mongoose.set('strictQuery', true);
mongoose.connect(Config.mongo_db_connection_string);
如果你不想要这个,你不需要指定任何东西,因为它将被默认设置为false。所以,你只要连接到数据库就可以了。
mongoose.connect(Config.mongo_db_connection_string);
const mongoose = require("mongoose");
mongoose.set('strictQuery', false);
mongoose.connect("mongodb://localhost:27017/fruitsDB", { useNewUrlParser: true });
const fruitSchema = new mongoose.Schema({
name: String,
rating: Number,
review: String
});
const Fruit = mongoose.model("Fruit", fruitSchema);
const fruit = new Fruit({
name: "Apple",
rating: 7,
review: "Taste Good"
});
fruit.save();
只用一行就可以删除这个警告
mongoose.set('strictQuery', true);
mongoose.connect(process.env.MONGO_URL)
一行
第一个错误的解决方法
你可以参考命令行指示本身。在使用Mongoose之前,只需使用建议行。
只需将以下行:
mongoose.connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true});
替换为:
mongoose.set('strictQuery', false);
mongoose.connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true});
mongoose.connect(process.env.MONGO_URL);
mongoose.set('strictQuery', true);
即使你包含了strictQuery
行,上面也会给你一个警告。 解决的办法就是把strictQuery
行放在mongoose.connect
之前。
mongoose.set('strictQuery', true);
mongoose.connect(process.env.MONGO_URL);
那么它就会起作用了!
mongoose.set('strictQuery',false);
mongoose.connect("mongodb://localhost:27017/mydb",{ useNewUrlParser: true })
这个警告信息表明Mongoose库目前正在使用"strictQuery"选项,这个选项在Mongoose 7中默认将被切换回"false"。Mongoose使用该选项来决定是否执行严格的查询语法。当设置为"false"时,Mongoose将允许查询条件匹配多个属性。
为了解决这个警告,你可以在你的代码中通过使用以下一行将"strictQuery"设置为"false"。
mongoose.set('strictQuery', false);
或者,如果你想继续使用严格的查询语法,你可以通过将"strictQuery"设置为"true"来抑制这个警告。
mongoose.set('strictQuery', true);
建议在Mongoose 7发布之前,根据这一变化更新你的代码。
例子 :
const mongoose = require("mongoose");
mongoose.set('strictQuery', false);
mongoose.connect("mongodb://localhost:27017/test", {
useNewUrlParser: true
});
废弃警告与你收到的错误没有任何关系。试着删除整个mongoose.set('strictQuery', true);
行,你会得到同样的结果。
试着把localhost
换成127.0.0.1
吧。
mongoose.connect('mongodb://127.0.0.1/fruitsDB')
你可以尝试将"localhost"改成"127.0.0.1",从
mongoose.connect('mongodb://localhost:27017/fruitsDB');
至
mongoose.connect("mongodb://127.0.0.1:27017/fruitsDB");
是的,你只需要把这行代码放在所有的上面。
mongoose.set( "strictQuery", false );
mongoose.connect( "mongodb://0.0.0.0:27017/NewDB", () => {
console.log(`Connected to MongoDB`)
});
在连接之前写入strictQuery
行,以避免这个问题。
const mongoose = require("mongoose");
mongoose.set('strictQuery', false);
mongoose.connect(
"mongodb://localhost:27017/fruitsDB",
{
useNewUrlParser: true
}
);
有同样的问题。只要确保你在MongoDB连接语句之前导入(require
)并使用dotenv
。对我来说是有效的。
const dotenv = require('dotenv');
dotenv.config({path: 'config.env'})
//mongodb connection
connectDB();
当你的连接建立后,只需进行以下操作即可。
mongoose.set('strictQuery',false);
我也面临着同样的问题。
在这里,你可以在这张图片上找到解决方案。
你只需在"import section"中添加这段代码即可。
-
mongoose.set('strictQuery',true);
const app=express();
const mongoose = require('mongoose');
const express= require('express');
mongoose.set('strictQuery', true);
我正在Udemy上学习同样的课程。Hafez的解决方案对我有效。
只需替换掉
mongoose.connect('mongodb://localhost:27017/fruitsDB', {useNewUrlParser: true});
为
mongoose.set('strictQuery', true);
mongoose.connect('mongodb://127.0.0.1/fruitsDB');
mongoose.connect('mongodb://0.0.0.0/fruitsDB')
我想我们在做同样的课程。我只是忽略了Mongoose的废弃警告。
const mongoose = require("mongoose");
const DB = process.env.MONGO_URL;
const connectedDB = async () => {
try {
mongoose.set("strictQuery", true);
const conn = await mongoose.connect(DB);
console.log(`mongoDB connection : ${conn.connection.host}`.cyan.underline);
} catch (err) {
console.log(`No connection : ${err}`.red.underline);
}
};
module.exports = connectedDB;
const mongoose = require("mongoose");
mongoose.set('strictQuery', false);
mongoose.connect("mongodb://127.0.0.1:27017/fruitsDB");
const fruitSchema = new mongoose.Schema({
name: String,
rating: Number,
review: String
});
const Fruit = mongoose.model("Fruit", fruitSchema);
const fruit = new Fruit({
name: "Apple",
rating: 7,
review: "Pretty solid!"
})
fruit.save();
适当的方式
const mongoose = require("mongoose");
mongoose.set("strictQuery", true);
mongoose
.connect("mongodb://0.0.0.0:0/test", {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => {
console.log("Connected!");
})
.catch((err) => {
console.log("oh no error");
console.log(err);
});
import express from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import cors from 'cors';
const app = express();
app.use(bodyParser.json({ limit: "30mb", extended: true }));
app.use(bodyParser.urlencoded({ limit: "30mb", extended: true }));
app.use(cors());
const CONNECTION_URL =
"mongodb+srv://<username>:<password>@cluster0.y3v2mwo.mongodb.net/?
retryWrites=true&w=majority";
const PORT = process.env.PORT || 5000;
mongoose.set("strictQuery", false);
mongoose.connect(CONNECTION_URL)
.then(() => app.listen(PORT, () => console.log(`Server running on port: ${PORT}`)))
.catch(error => console.log(error.message));
mongoose.set( "strictQuery", false );
mongoose.connect( "mongodb://0.0.0.0:27017/NewDB", () => {
console.log(`Connected to MongoDB`)
});
经过几次尝试,这为我解决了Deprecation警告,感谢发帖人......
// Mongoose setup //
const PORT = 8000;
mongoose
.connect(
process.env.MONGO_URL,
{
useNewUrlParser: true,
useUnifiedTopology: true,
},
**mongoose.set('strictQuery', false)**
)
.then(() => {
app.listen(PORT, () => console.log(`Server port: ${PORT}`));
})
.catch((err) => console.log(`${err} did not connect`));