DeprecationWarning:Mongoose:在 Mongoose 7 中,“strictQuery”选项将默认切换回“false”

Rah*_*ran 47 javascript mongoose mongodb node.js deprecation-warning

我只是从我的数据库创建一个名为 Fruits 的数据库app.js,并使用 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();
Run Code Online (Sandbox Code Playgroud)

每当我尝试时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
Run Code Online (Sandbox Code Playgroud)

然后第二个错误也继续fruits.insertOne()

因此,我的 MongoDB 数据库没有更新。

test> show dbs
admin    40.00 KiB
config  108.00 KiB
local    40.00 KiB
shopDB   72.00 KiB
Run Code Online (Sandbox Code Playgroud)

我只想修复这个错误。但我不知道在哪里修复这个错误。对于错误的第二部分,它似乎来自node_modules本身。我该如何修复这个错误?

Zeb*_*der 88

mongoose.set("strictQuery", false);

mongoose.connect(process.env.MONGO_URL);
Run Code Online (Sandbox Code Playgroud)

或者

mongoose.set("strictQuery", false);
mongoose.connect(process.env.MONGO_URL, () => {
  console.log("Connected to MongoDB");
});
Run Code Online (Sandbox Code Playgroud)
mongoose.set("strictQuery", false);

mongoose.connect(process.env.MONGO_URL);
Run Code Online (Sandbox Code Playgroud)


Nen*_*vic 35

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

当该strict选项设置为true时,Mongoose 将确保只有架构中指定的字段才会保存在数据库中,而所有其他字段都不会被保存(如果发送了其他一些字段)。

目前,该选项默认启用,但在 Mongoose v7 中将默认更改为false 。这意味着所有字段都将保存在数据库中,即使其中一些字段未在架构模型中指定。


因此,如果您想要拥有严格的模式并仅在数据库中存储模型中指定的内容,从 Mongoose v7 开始,您必须手动将strict选项设置为true

mongoose.set('strictQuery', true);
mongoose.connect(Config.mongo_db_connection_string);
Run Code Online (Sandbox Code Playgroud)

如果您不想这样做,则不必指定任何内容,因为默认情况下它将设置为false。因此,您只需连接到数据库即可。

mongoose.connect(Config.mongo_db_connection_string);
Run Code Online (Sandbox Code Playgroud)

  • strict Schema 与 strictQuery 选项不同。正如猫鼬文档中所述:https://mongoosejs.com/docs/guide.html#strict。Schema strict 选项默认启用,并且可以在 Schema 级别进行更改,并且默认行为在 mongoose 版本 7 中也没有更改。正如您所概述的那样,可以全局设置的 strictQuery 选项将在 mongoose 7 中设置为 false。 https://mongoosejs.com/docs/guide.html#strictQuery:strictQuery 选项仅用于查询过滤器。 (6认同)

小智 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();
Run Code Online (Sandbox Code Playgroud)

  • 通过添加更多有关代码的作用以及它如何帮助操作员的信息,可以改进您的答案。 (3认同)