Mongoose 错误 "CastError: Cast to ObjectId failed for value“ 的解决方案
在使用 Mongoose 进行数据库操作时,我们有时会遇到 "CastError: Cast to ObjectId failed for value" 这个错误。这个错误是由于我们试图将非 ObjectId 类型的值赋给 _id 字段或者在查询时将非 ObjectId 类型的值作为查询条件传递。
这个错误的原因是 Mongoose 在对 ObjectId 类型的字段进行类型检查时,如果不是 ObjectId 类型的值,就会抛出这个错误。解决这个错误的方法有几种,下面我们来逐一分析。
- 检查 _id 字段是否正确赋值
如果我们手动给 _id 字段赋值,我们需要确保 _id 的值是 ObjectId 类型。否则就会出现这个错误。下面是一段示例代码:
const mongoose = require('mongoose'); const ObjectId = mongoose.Types.ObjectId; const userSchema = new mongoose.Schema({ _id: { type: mongoose.Schema.Types.ObjectId }, name: { type: String } }); const UserModel = mongoose.model('User', userSchema); const user = new UserModel({ _id: "1234567890", name: "Tom" }); user.save(function (err, savedUser) { console.log(err); // CastError: Cast to ObjectId failed for value "1234567890" at path "_id" });
在这个示例中,我们手动将一个字符串赋值给了 _id 字段,这个字符串并不是 ObjectId 类型,所以 Mongoose 就抛出了错误。
正确的做法是使用 mongoose 的 Types.ObjectId
根据字符串生成一个 ObjectId:
const user = new UserModel({ _id: ObjectId("1234567890"), name: "Tom" });
- 检查查询条件是否正确
在查询数据时,也有可能会出现这个错误。例如,我们需要查询 _id 为 1234567890 的用户,在 Mongoose 中这样写:
UserModel.find({ _id: "1234567890" }, function (err, users) { console.log(err); // CastError: Cast to ObjectId failed for value "1234567890" at path "_id" });
这个代码中,我们将字符串 "1234567890" 作为查询条件传递给了 find
方法,而这个字符串并不是 ObjectId 类型,所以就会出现错误。
正确的做法是和上面一样,使用 Types.ObjectId
将字符串转换成 ObjectId 类型:
UserModel.find({ _id: ObjectId("1234567890") }, function (err, users) { console.log(users); });
- 检查 Schema 是否定义正确
最后,我们需要检查 Schema 是否定义正确。例如,如果我们在 Schema 中将 _id 字段定义成 String 类型,即使我们在赋值时使用了 ObjectId,也会出现上面的错误:
const userSchema = new mongoose.Schema({ _id: { type: String }, name: { type: String } }); const UserModel = mongoose.model('User', userSchema); const user = new UserModel({ _id: ObjectId("1234567890"), // 注意这里 name: "Tom" }); user.save(function (err, savedUser) { console.log(err); // CastError: Cast to ObjectId failed for value ObjectId("1234567890") at path "_id" });
在这个示例中,我们将 _id
字段定义成了 String
类型,所以无论我们在赋值时使用了 ObjectId,还是在查询时将字符串传递给了 _id
字段,都会出现 "CastError" 的错误。
正确的做法是将 _id
字段定义成 mongoose.Schema.Types.ObjectId
类型:
const userSchema = new mongoose.Schema({ _id: { type: mongoose.Schema.Types.ObjectId }, name: { type: String } }); const UserModel = mongoose.model('User', userSchema); const user = new UserModel({ _id: ObjectId("1234567890"), name: "Tom" }); user.save(function (err, savedUser) { console.log(savedUser); });
总结
在使用 Mongoose 时,遇到 "CastError: Cast to ObjectId failed for value" 这个错误,我们需要仔细检查代码,找出错误的原因,然后采取相应的解决方案。同时,我们还需要注意将 _id
字段定义成 mongoose.Schema.Types.ObjectId
类型,避免出现这个错误。
最后,我们希望这篇文章能够帮助大家更好地使用 Mongoose,加深对该库的理解和掌握。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a1fa33add4f0e0ffa0e60a