转换为 [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'