Tengo una ruta que devuelve una historia particular de una identificación de objeto. Cuando intento probarlo, me da algunos errores. El código dentro del bloque if no se está ejecutando de alguna manera.
router.get("/:id",async (req,res) => { try{ if (!isValidObjectId(req.params.userId)) { res.status(401).json({ message: "Invalid object id", success: false }) throw new Error("Invalid object id") } let story = await Story.findById(req.params.id) .populate('user') .lean() if (!story) { return res.status(404).json({ message: "Story not found", success: false }) } const text = convert(story.body, { wordwrap: null }); res.render('stories/show',{ story, title: `${story.title} Storybooks`, desc: `${text}` }) } catch(err) { console.error(err) } }) No quiero ejecutar la consulta si la identificación no es válida, diga /stories/blabla
¿Cómo puedo hacer eso?
Su respuesta es apreciada.
Para aquellos de ustedes que luchan con el problema, aquí hay un ahorro de tiempo:
Primero, usamos el método isValid en mongoose.Types.ObjectId y luego, como segundo control, creamos una identificación de objeto real y la comparamos como una cadena.
Así es como lo importarías y lo usarías:
const mongoose = require('mongoose'); const {Types: {ObjectId}} = mongoose; const validateObjectId = (id) => ObjectId.isValid(id) && (new ObjectId(id)).toString() === id; //true or falseEn cuanto a responder a mi propia pregunta:
const mongoose = require('mongoose'); const {Types: {ObjectId}} = mongoose; const validateObjectId = (id) => ObjectId.isValid(id) && (new ObjectId(id)).toString() === id; //true or false // @desc Show a single story // @route GET /stories/:id router.get("/:id",async (req,res) => { try{ if (!validateObjectId(req.params.id)) { throw Error("Invalid object Id") } let story = await Story.findById(req.params.id) .populate('user') .lean() if (!story) { return res.status(404).json({ message: "Story not found", success: false }) } const text = convert(story.body, { wordwrap: null }); res.render('stories/show',{ story, title: `${story.title} Storybooks`, desc: `${text}` }) } catch(err) { console.error(err) } })EDITAR:
Usé req.params.userId en lugar de req.params.id, por lo que el método anterior está totalmente bien.
Pero acabo de aprender una nueva forma de hacerlo.