Por favor ayudame con esto. Tengo una consulta de publicación y quiero guardarla en dos tablas por separado. Pero encontré un mensaje de error del cartero "Transmitir a [ObjectId] falló por valor" ¡Por favor, ayúdenme! ¡Gracias!
Aquí está mi código a continuación:
PrimerModelo
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 } ]})
segundo modelo
const classSchema = new mongoose.Schema({ name: { type: String, unique: true },})
y aquí está mi controlador
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 } }) }})
Es porque está tratando de configurar sus classes en su Subject antes de que tengan ObjectIds . En su Subject Schema tiene la siguiente línea:
classes: [ { type: Schema.Types.ObjectId, ref: class.schema } ] Lo que le dice a Mongoose que está haciendo referencia a otro modelo con su ObjectId asignado, pero en su caso, cuando intenta guardarlo:
await Subject.create(req.body)Estas clases aún no tienen ID, por lo que debe crearlas. No los configuraría manualmente, cuando la mangosta los configura por sí solo. Así que la siguiente sería una sugerencia.
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); } Este método crea las clases tal como las tenía en su código, pero luego le da las clases al Sujeto después de que se hayan creado, de esa manera el Subject puede usarlas. De lo contrario, obtendrá un error de ObjectId porque no puede asignar un campo con una referencia, por ejemplo classes: [ { type: Schema.Types.ObjectId, ref: class.schema } ] sin una reference a ese elemento. Por cierto, en su ref: class.schema solo use ref: 'Class'