Estoy tratando de obtener y mostrar todas las entradas en una colección de 'elementos' que contienen y están enumeradas por un usuario/ID de usuario de una colección de usuarios.
elemento_controlador.js:
const Item = require('../models/item_schema') const getUserItems = (req, res) => { Item.findById(req.params.userID).populate('categoryID').populate('qualityID').populate('userID') .then((data) => { if (data) { res.status(200).json(data) } else { res.status(404).json(`Item from user id ${req.params.userID} not found.`) } }) } module.exports = { getUserItems }item_schema.js:
const { Schema, model} = require('mongoose') const itemSchema = new Schema({ title: { type: String, required: [true, 'Title field is required.'] }, description: { type: String, required: [true, 'Description field is required.'] }, userID: { type: Schema.Types.ObjectId, ref: "User", required: [true, 'User field is required'] }, categoryID: { type: Schema.Types.ObjectId, ref: "Category", required: [true, 'Category field is required'] }, qualityID: { type: Schema.Types.ObjectId, ref: "Quality", required: [true, 'Quality field is required'] }, price: { type: Number }, claimed:{ type: Boolean } }, { timestamps: true }) module.exports = model('Item', itemSchema)servidor.js:
const express = require('express') const cors = require('cors') const jwt = require('jsonwebtoken') require('dotenv').config() require('./db')() const { getUserItems } = require('./controllers/item_controller') const port = process.env.PORT || 3000 const app = express() app.use(cors()) app.use(express.json()) app.use((req, res, next) => { if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { jwt.verify(req.headers.authorization.split(' ')[1], 'zero_waste_app', (err, decode) => { if (err) req.user = undefined req.use r = decode next() }) } else { req.user = undefined next() } }) // Item Routes app.get('items/user/:userID', getUserItems) app.listen(port, () => { console.log(`Example app listening on port ${port}`) }) Creo que mi problema está en item_controller, probé algunas formas diferentes, como Item.find({userID: userID}) o incluso codificar un ID de usuario en Item.find({userID: '620a6299299db14c46a1eb9f'}) , pero No puedo conseguir que funcione. ¿Alguien sabe qué estoy haciendo mal y cómo puedo solucionarlo?
También hágamelo saber si hay más información o código que pueda dar que sea útil.
Entonces, en primer lugar, si no especifica la clave principal, mongoose generará automáticamente un campo _id en sus colecciones. y este atributo es el que se usa en los métodos "...ById" de la colección, como findById , findByIdAndUpdate , etc.
Ok, ¿cómo resuelve tu problema? Está utilizando el método Item.findById utilizando el valor de un ID de _id userID completamente diferente. Debe usar el método .find pasando el atributo de ID de userID , tampoco necesita encadenar los métodos de populate , puede completar muchos campos en una sola llamada de método.
Intenta cambiar tu controlador a esto:
const {userID} = req.params; Item .find({userID}) .populate('categoryID qualityID userID') .then((data) => { if (data) { return res.status(200).json(data) } return res.status(404).json(`Item from user id ${req.params.userID} not found.`) })Me lo imaginé.
const getUserItems = (req, res) => { Item.find({userID: req.params.userID}).populate('categoryID').populate('qualityID') .then((data) => { if (data) { res.status(200).json(data) } else { res.status(404).json(`Item from user id ${req.params.userID} not found.`) } }) }también a mi ruta le faltaba un '/' al principio, así que:
app.get('/items/user/:userID', getUserItems)y no lo que tenía anteriormente:
app.get('items/user/:userID', getUserItems)