Problema de Mongoose con el id del objeto “Cast to ObjectId failed for value”
Es una explicación larga, así que para facilitar las cosas, llamaré a los usuarios X e Y.
Tengo este código, cuya intención es que X (realizando las solicitudes) agregue su ID a las solicitudes pendientes de Y, así como a sus propias solicitudes enviadas.
const postSendBBRequest = async (req, res) => {
const userRecipient = await User.findById(req.params.id)
const userSender = await User.findById(req.userId);
const senderId = userSender.id;
try {
if (senderId == userRecipient.id) {
res.status(406).json("No puedes tener te mismo como hermano")
} else {
userSender.sentBBRequests.push({senderId});
await userSender.save();
userRecipient.receivedBBRequests.push({senderId});
await userRecipient.save();
res.status(201).json("Solicitud de hermandad enviada exitosamente")
}
} catch (ERR) {
res.status(500).json({ Message: ERR.message });
}
}
Mi ruta de prueba en Postman es /add/61b29bb33e775393ae369b79
El problema es: estoy obteniendo un error: "Cast to ObjectId failed for value "{ senderId: '61b29aef3e775393ae369b74' }" (type Object) at path "sentBBRequests"
Pensé que tal vez el problema era cómo estaba organizado mi esquema también:
receivedBBRequests: [
{
type: mongoose.Schema.Types.ObjectId,
},
],
sentBBRequests: [
{
type: mongoose.Schema.Types.ObjectId,
},
],
brothers: {
type: [
{
type: mongoose.Schema.Types.ObjectId,
},
]}
“`
Hay demasiados puntos de falla, ni siquiera puedo pensar en algo para resolverlo.
Muchas gracias.
davy.ai
Parece que el problema está relacionado con una incompatibilidad de tipos de datos. El mensaje de error sugiere que el campo
sentBBRequests
espera un ObjectId, pero está recibiendo un objeto que contiene una clavesenderId
y su valor.Para solucionar este problema, necesitamos modificar el esquema de
sentBBRequests
para que coincida con los datos que queremos almacenar. Dado que queremos almacenar la identificación del remitente, podemos modificar el esquema de la siguiente manera:Al agregar la opción
ref
, le estamos indicando a Mongoose que este campo hará referencia a la colecciónUser
y podemos usar esta referencia para popular el campo con el objeto de usuario relevante.Ahora, en el bloque de código, podemos simplificar la forma en que agregamos datos a los arreglos
sentBBRequests
yreceivedBBRequests
, de la siguiente manera:Al simplemente ingresar la identificación del usuario, nos aseguramos de almacenar un valor ObjectId en lugar de un objeto. Podemos usar este valor más tarde para popular el campo con el objeto de usuario relevante.
Finalmente, debemos asegurarnos de pasar el valor correcto de
req.userId
para obtener el objeto del remitente. Puede actualizar su ruta de prueba para pasar el valor correcto dereq.userId
de la siguiente manera:¡Espero que esto ayude!