Tengo un problema extraño al consultar una colección de Mongo DB. Estoy usando findById() para obtener un solo elemento que funcione algunas veces y otras no.
Verifiqué la identificación que se pasa a la ruta del servidor y, en todos los casos, coincide perfectamente con el documento de destino en la colección.
Aquí está el código básico:
router.get("/:postId", async (req, res) => { console.log('id : ', req.params.postId) console.log('type: ', typeof(req.params.postId)) // id is a string try { const post = await Post.findById(req.params.postId).exec(); console.log('post :', post) // sometimes null res.json(post); } catch (err) { res.json({ message: err }); } }); En la ruta anterior, solo se encontrarán ciertas publicaciones, mientras que otras volverán null . Esto sucede independientemente de si la identificación pasada es correcta y si el documento existe con la identificación exacta.
Si alguien tiene alguna idea sobre lo que podría estar yendo mal aquí, ¡agradecería mucho la ayuda!
EDITAR
He hecho más depuración y creo que tiene algo que ver con el modelo Schema for the Post.
Por ejemplo, este objeto se encontrará:
{ "tags": ["foo"], "_id": "8394839483fhg020834903", "title": "bar", "content": "baz", "isPrivate": true, } Pero este no lo hará debido a la falta de propiedad isPrivate .
{ "tags": [], "_id": "5e0fdc631ef5c46b285a4734", "title": "New post", "content": "Some content here", }He probado esto en múltiples consultas y parece ser la raíz del problema.
he intentado agregar
isPrivate: { required: false }Para el esquema, pero no parece resolver el problema.
Aquí está el esquema completo
const postSchema = mongoose.Schema({ title: { type: String, required: true }, content: { type: String, required: true }, tags: [{ type: String }], date: { type: Date, default: Date.now }, isPrivate: { type: Boolean required: false } });No soy un experto en Mongo/Mangoose, por lo que agradecería mucho cualquier orientación.
Si la identificación de la publicación coincide con algún registro, devolverá datos; de lo contrario, devolverá un valor nulo. Deberías manejar la excepción.
router.get("/:postId", async (req, res) => { try { const post = await Post.findById(req.params.postId).exec(); if(post) { return res.json(post); } res.json({ message:'No Post found' }); } catch (err) { res.json({ message: err }); } });Puede verificar manualmente si existe un registro con una identificación de publicación. Puede usar MongoDB Compass para la interfaz gráfica de usuario para navegar por el registro
Creo que el problema podría ser con su _id según el estándar de mongo _id debe ser una cadena de 12 bytes o una cadena de 24 caracteres hexadecimales.
Podemos verificar si el _id es válido usando mongoose.isValidObjectId()
Ejecuté esta verificación en los objetos que publicaste y, de hecho, 1 no es válido mientras que el otro es válido
const mongoose = require('mongoose'); console.log(`is '8394839483fhg020834903' valid - ${mongoose.isValidObjectId('8394839483fhg020834903')}`); console.log(`is '5e0fdc631ef5c46b285a4734' valid - ${mongoose.isValidObjectId('5e0fdc631ef5c46b285a4734')}`);Deberá verificar qué está modificando su ID en el código, también puede cargar su esquema para obtener una mejor comprensión.