MongoDB: 如何通过userID获取和显示items

MongoDB: How to get and display items by userID

我正在尝试获取并显示 'item' 集合中的所有条目,这些条目包含用户集合中的 user/userID 并由其列出。

item_controller.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)

server.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}`)
})

我认为我的问题出在 item_controller,我尝试了几种不同的方法,例如 Item.find({userID: userID}) 甚至在 Item.find({userID: '620a6299299db14c46a1eb9f'}) 中硬编码用户 ID,但我不能'无法正常工作。有谁知道我做错了什么以及我该如何解决?

此外,如果我能提供更多信息或代码会有帮助,请务必告诉我。

所以,首先,如果你不指定主键,mongoose 会自动在你的集合中生成一个_id 字段。并且此属性是在集合的“...ById”方法中使用的属性,如 findByIdfindByIdAndUpdate

好的,它如何解决您的问题?您正在使用 Item.findById 方法使用 userID 的值,但您的 _id 完全不同。您必须使用传递 userID 属性的 .find 方法,也不需要链接 populate 方法,您可以在一次方法调用中填充多个字段。

尝试将您的控制器更改为:

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.`)
        
    })

我想通了。

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.`)
        }
    })
}

另外,我的路线开头缺少“/”,所以:

app.get('/items/user/:userID', getUserItems)

而不是我以前拥有的:

app.get('items/user/:userID', getUserItems)