转换为 [ObjectId] 的值失败
Cast to [ObjectId] failed for value
请帮我解决这个问题。我有一个 post 查询,我想将它分别保存到两个表中。但是我遇到了来自 postman 的错误消息“Cast to [ObjectId] failed for value”
请帮我!谢谢!
下面是我的代码:
第一个模型
const mongoose= require('mongoose');
const { Schema } = mongoose;
const class = require('./classModel');
const SubjectSchema = new mongoose.Schema({
name: {
type: String,
unique: true
},
address: {
type: String,
},
classes: [ { type: Schema.Types.ObjectId, ref: class.schema } ]
})
第二个模型
const classSchema = new mongoose.Schema({
name: {
type: String,
unique: true
},
})
这是我的控制器
exports.create = catchAsync (async (req, res, next) => {
const newSubject = await Subject.create(req.body)
let payload = {
body : {
...req.body.classes,
_id: new mongoose.Types.ObjectId(),
golf_course_id: newGolfCourse._id
}
}
const newClass = await Class.createClass(payload)
if(!newClass ) {
res.status(201).json({
status: 'success',
data : {
subject: newSubject
}
})
}
})
这是因为您试图在 Subject
之前将 classes
设置为 ObjectIds
。在您的 Subject Schema
中,您有以下行:
classes: [ { type: Schema.Types.ObjectId, ref: class.schema } ]
这告诉 Mongoose 您正在引用另一个已分配的模型 ObjectId
但在您尝试保存它的情况下:
await Subject.create(req.body)
这些 类 还没有 ID,因此您需要创建它们。当猫鼬自行设置它们时,我不会手动设置它们。所以下面是一个建议。
try {
const classes = req.body.classes.map(async (className) => {
const newClass = new Class({ name: className });
newClass.golf_course_id = newGolfCourse._id;
await newClass.save();
return newClass;
});
const results = await Promise.all(classes);
const newSubject = await new Subject({
name: req.body.name,
address: req.body.address,
classes: results,
});
res.send(newSubject);
} catch (error) {
console.log(error);
}
此方法创建 类 就像您在代码中创建的一样,但随后它将 类 提供给主题 在 创建之后,这样 Subject
就可以使用它们了。否则你会得到一个 ObjectId
错误,因为你不能分配一个带有引用的字段,例如classes: [ { type: Schema.Types.ObjectId, ref: class.schema } ]
没有 reference
那个项目。顺便说一下,在你的 ref: class.schema
中使用 ref: 'Class'
请帮我解决这个问题。我有一个 post 查询,我想将它分别保存到两个表中。但是我遇到了来自 postman 的错误消息“Cast to [ObjectId] failed for value” 请帮我!谢谢!
下面是我的代码:
第一个模型
const mongoose= require('mongoose');
const { Schema } = mongoose;
const class = require('./classModel');
const SubjectSchema = new mongoose.Schema({
name: {
type: String,
unique: true
},
address: {
type: String,
},
classes: [ { type: Schema.Types.ObjectId, ref: class.schema } ]
})
第二个模型
const classSchema = new mongoose.Schema({
name: {
type: String,
unique: true
},
})
这是我的控制器
exports.create = catchAsync (async (req, res, next) => {
const newSubject = await Subject.create(req.body)
let payload = {
body : {
...req.body.classes,
_id: new mongoose.Types.ObjectId(),
golf_course_id: newGolfCourse._id
}
}
const newClass = await Class.createClass(payload)
if(!newClass ) {
res.status(201).json({
status: 'success',
data : {
subject: newSubject
}
})
}
})
这是因为您试图在 Subject
之前将 classes
设置为 ObjectIds
。在您的 Subject Schema
中,您有以下行:
classes: [ { type: Schema.Types.ObjectId, ref: class.schema } ]
这告诉 Mongoose 您正在引用另一个已分配的模型 ObjectId
但在您尝试保存它的情况下:
await Subject.create(req.body)
这些 类 还没有 ID,因此您需要创建它们。当猫鼬自行设置它们时,我不会手动设置它们。所以下面是一个建议。
try {
const classes = req.body.classes.map(async (className) => {
const newClass = new Class({ name: className });
newClass.golf_course_id = newGolfCourse._id;
await newClass.save();
return newClass;
});
const results = await Promise.all(classes);
const newSubject = await new Subject({
name: req.body.name,
address: req.body.address,
classes: results,
});
res.send(newSubject);
} catch (error) {
console.log(error);
}
此方法创建 类 就像您在代码中创建的一样,但随后它将 类 提供给主题 在 创建之后,这样 Subject
就可以使用它们了。否则你会得到一个 ObjectId
错误,因为你不能分配一个带有引用的字段,例如classes: [ { type: Schema.Types.ObjectId, ref: class.schema } ]
没有 reference
那个项目。顺便说一下,在你的 ref: class.schema
中使用 ref: 'Class'