DeprecationWarning: Mongoose: the `strictQuery` option will be switched back to `false` by default in Mongoose 7

回答 23 浏览 8.1万 2022-12-09

我只是从我的 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本身。我怎样才能修复这个错误呢?

Rahul Saran 提问于2022-12-09
请在寻求解决方案之前了解实际问题,1. 将您的代码放入 try catch 并检查错误是什么,在我的情况下,我定义了约束并添加了数据,这就是它提供错误的原因,所以我只是更改了我的约束和评论的寓意:如果我们严格地放置数据,可能会违反任何约束Haseeb Ullah 2022-12-22
const fruitSchema = new mongoose.Schema({ name: String, rating: Number, review: String }); please Change it to const fruitSchema = new mongoose.Schema({ name: {type: String}, rating:{type: Number} , review: {type: String} }); 它不会给出任何错误。Haseeb Ullah 2022-12-22
关于"nodule_modules"。你不是指node_modules吗?(名为"node_modules"的文件夹)。Peter Mortensen 2023-02-16
据称,它是来自Udemy课程的Peter Mortensen 2023-02-16
23 个回答
#1楼 已采纳
得票数 68
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);
    }
ZebraCoder 提问于2022-12-12
Andrew Bwogi 修改于2023-02-28
#2楼
得票数 22

我想为现有的答案提供更多的背景。

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);
NeNaD 提问于2022-12-17
Peter Mortensen 修改于2023-02-16
strict Schema 与 strictQuery 选项不同。正如mongoose文档中所述。mongoosejs.com/docs/guide.html#strict。Schema严格选项是默认启用的,可以在Schema级别上进行更改,同时默认行为在mongoose 7版本中没有改变。在mongoose 7中,可以全局设置的strictQuery选项将被设置为false。mongoosejs.com/docs/guide.html#strictQuery。strictQuery选项只是用于查询过滤器。toinhao 2023-01-09
#3楼
得票数 5
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();
MATI UL REHMAN 提问于2022-12-16
Tyler2P 修改于2022-12-19
我们应该先使用给定的行,然后再使用mongoose:Connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true}); mongoose. Set('strictQuery', false);MATI UL REHMAN 2022-12-16
你的答案可以通过添加更多关于代码的作用和如何帮助OP的信息而得到改进。Tyler2P 2022-12-19
#4楼
得票数 3

只用一行就可以删除这个警告

mongoose.set('strictQuery', true);
mongoose.connect(process.env.MONGO_URL)

一行

Patwal 提问于2022-12-12
Patwal 修改于2022-12-12
为我工作 你也可以试试这个stackoverflow.com/a/74768921/18961814ZebraCoder 2022-12-12
#5楼
得票数 3

第一个错误的解决方法

你可以参考命令行指示本身。在使用Mongoose之前,只需使用建议行。

只需将以下行:

mongoose.connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true});

替换为:

mongoose.set('strictQuery', false);
mongoose.connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true});
Neil Sagar Sahu 提问于2022-12-16
Peter Mortensen 修改于2023-02-16
#6楼
得票数 2

mongoose.connect(process.env.MONGO_URL);

mongoose.set('strictQuery', true);

即使你包含了strictQuery行,上面也会给你一个警告。 解决的办法就是把strictQuery行放在mongoose.connect之前。

mongoose.set('strictQuery', true);

mongoose.connect(process.env.MONGO_URL);

那么它就会起作用了!

Asitha karnatakam 提问于2022-12-13
Peter Mortensen 修改于2023-02-16
#7楼
得票数 1

mongoose.set('strictQuery',false);

mongoose.connect("mongodb://localhost:27017/mydb",{ useNewUrlParser: true })

Abhinav Trivedi 提问于2023-01-02
#8楼
得票数 1

这个警告信息表明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
  });
Suresh B 提问于2023-02-01
#9楼
得票数 1

废弃警告与你收到的错误没有任何关系。试着删除整个mongoose.set('strictQuery', true);行,你会得到同样的结果。

试着把localhost换成127.0.0.1吧。

mongoose.connect('mongodb://127.0.0.1/fruitsDB')
Hafez 提问于2022-12-10
Peter Mortensen 修改于2023-02-16
非常感谢,@Hafez兄弟。现在它工作得很好。我终于可以访问我的MongoDB了。版本: MongoDB : 6.0.3 Mongoose : 6.8.0Rahul Saran 2022-12-10
对我来说并不奏效,仍然收到同样的警告。Joseph Owigo 2022-12-10
谢谢,它对mongoose 6.9.1起作用了。Chandresh 2023-02-09
欢迎来到Stack Overflow!Stack Overflow不是一个论坛。请不要把Stack Overflow当作论坛来使用。Stack Overflow不是一个论坛。例如,要求提供更多信息的问题属于问题的评论中。提前感谢。Peter Mortensen 2023-02-16
#10楼
得票数 0

你可以尝试将"localhost"改成"127.0.0.1",从

mongoose.connect('mongodb://localhost:27017/fruitsDB');

mongoose.connect("mongodb://127.0.0.1:27017/fruitsDB");
Mor 提问于2023-01-17
#11楼
得票数 0

是的,你只需要把这行代码放在所有的上面。

mongoose.set( "strictQuery", false );
mongoose.connect( "mongodb://0.0.0.0:27017/NewDB", () => {
    console.log(`Connected to MongoDB`)
});

请看控制台信息

Future Programmer 提问于2023-01-18
#12楼
得票数 0

在连接之前写入strictQuery行,以避免这个问题。

const mongoose = require("mongoose");

mongoose.set('strictQuery', false);

mongoose.connect(
  "mongodb://localhost:27017/fruitsDB", 
  {
    useNewUrlParser: true
  }
);
Ehsanullah Qadeer 提问于2023-01-19
Tyler2P 修改于2023-01-20
#13楼
得票数 0

有同样的问题。只要确保你在MongoDB连接语句之前导入(require)并使用dotenv。对我来说是有效的。

const dotenv = require('dotenv');
dotenv.config({path: 'config.env'})

//mongodb connection
connectDB();
Himanshu Singh 提问于2023-01-30
tdy 修改于2023-02-03
正如目前所写,您的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到更多关于如何写出好的答案的信息。Community 2023-02-01
#14楼
得票数 0

当你的连接建立后,只需进行以下操作即可。

mongoose.set('strictQuery',false);
deep Kaur 提问于2023-02-06
Dexter 修改于2023-02-08
#15楼
得票数 0

我也面临着同样的问题。

在这里,你可以在这张图片上找到解决方案。

  1. 你只需在"import section"中添加这段代码即可。

  2. mongoose.set('strictQuery',true);

  3. const app=express();

  4. const mongoose = require('mongoose');

  5. const express= require('express');

  6. mongoose.set('strictQuery', true);

TRENDING WIRALLY YOUTUBE 提问于2023-02-09
Eric Aya 修改于2023-02-09
#16楼
得票数 0

我正在Udemy上学习同样的课程。Hafez的解决方案对我有效。

只需替换掉

mongoose.connect('mongodb://localhost:27017/fruitsDB', {useNewUrlParser: true});

mongoose.set('strictQuery', true);
mongoose.connect('mongodb://127.0.0.1/fruitsDB');
Amir Mohammadi 提问于2022-12-13
Peter Mortensen 修改于2023-02-16
该课程的标题是什么?Peter Mortensen 2023-02-16
#17楼
得票数 0
mongoose.connect('mongodb://0.0.0.0/fruitsDB')

我想我们在做同样的课程。我只是忽略了Mongoose的废弃警告。

Adrian Banton 提问于2022-12-14
Peter Mortensen 修改于2023-02-16
该课程的标题是什么?Peter Mortensen 2023-02-16
#18楼
得票数 -1
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;
Mahabur Rahman 提问于2023-01-18
#19楼
得票数 -1
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();
pratik Kaple 提问于2023-01-17
Tyler2P 修改于2023-01-18
这样做,你的问题就会得到解决了。pratik Kaple 2023-01-17
#20楼
得票数 -1

适当的方式

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);
  });
s.imran 提问于2023-01-20
Suraj Rao 修改于2023-01-20
#21楼
得票数 -1
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));
Ali Raza 提问于2023-01-31
请补充说明。Syscall 2023-01-31
#22楼
得票数 -1
mongoose.set( "strictQuery", false );
mongoose.connect( "mongodb://0.0.0.0:27017/NewDB", () => {
    console.log(`Connected to MongoDB`)
});

经过几次尝试,这为我解决了Deprecation警告,感谢发帖人......

Abiola Martins 提问于2023-02-12
Tyler2P 修改于2023-02-15
#23楼
得票数 -1
// 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`));
Sakhawat Hossain 提问于2022-12-28
Peter Mortensen 修改于2023-02-16
解释一下就可以了。例如,这个想法/要点是什么?来自帮助中心"...总是解释为什么你提出的解决方案是合适的,以及它是如何工作的"。请通过编辑(改变)你的答案,而不是在这里的评论("编辑:","更新:",或类似的方式--答案应该像今天写的那样出现)。另外,它是从哪里复制过来的?它是由ChatGPT生成的吗?Peter Mortensen 2023-02-16