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”方法中使用的属性,如 findById
、findByIdAndUpdate
等
好的,它如何解决您的问题?您正在使用 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)
我正在尝试获取并显示 '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”方法中使用的属性,如 findById
、findByIdAndUpdate
等
好的,它如何解决您的问题?您正在使用 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)