使用Mongoose无法读取MongoDB文档,请求问题排查
问题排查:MongoDB查询返回0个文档
我配置了Schema、控制器和路由,但访问http://localhost:8080/api/v1/album时,控制台始终显示找到0个文档。Schema看起来和已上传的MongoDB文档一致,以下是相关代码,求帮忙分析问题。
相关代码
Index.js
import express from 'express'; import connectDB from './mongodb/connect.js'; import cors from 'cors'; import * as dotenv from 'dotenv'; import userRouter from './mongodb/routes/user.routes.js' import albumRouter from './mongodb/routes/album.routes.js' // ** configs dotenv.config(); const app = express(); app.use(express.json()); app.use(express.urlencoded()); app.get('/', (req, res) => { res.send({ message: "Hello" }) }) app.use('/api/v1/users', userRouter); app.use('/api/v1/album', albumRouter); const serverInit = async () => { try { connectDB(process.env.MONGODB_URL); app.listen(8080, console.log('server on 8080')) } catch (error) { console.log(error) } } serverInit();
album.js(Schema)
import mongoose, { Schema } from "mongoose"; const AlbumSchema = new mongoose.Schema({ album_id: {type: String, required: true}, title: {type: String, required: true}, artist: {type: String, required: true}, label: {type: String, required: true}, genre: {type: String, required: true}, khz: {type: Number, required: true}, bitrate: {type: Number, required: true}, numTracks: {type: Number, required: true}, runtime: {type: Number, required: true}, parental: {type: Boolean, required: true}, }, { collection: 'app-data.albums' }) const albumModel = mongoose.model('Album', AlbumSchema) export default albumModel;
album.routes.js
import express from 'express'; import { getAllAlbums, getAlbumDetail } from '../controllers/album.controller.js' const router = express.Router(); router.route('/').get(getAllAlbums) router.route('/:id').get(getAlbumDetail) export default router;
控制器代码
import User from '../models/user.js' import Album from '../models/album.js' import * as dotenv from 'dotenv' dotenv.config(); const getAllAlbums = async (req, res) => { try { console.log('Retrieving all albums from the app-data.albums collection...'); const albums = await Album.find({}).limit(req.query._end) //find all albums in db console.log(`Found ${albums.length} albums`); res.status(200).json(albums) } catch (error) { res.status(500).json({ msg: error.message }) } }; const getAlbumDetail = async (req, res) => {}; export { getAllAlbums, getAlbumDetail }
可能的问题与修复方案
1. 数据库连接未等待完成
connectDB是异步函数,但当前代码未添加await,导致服务器启动时数据库还未完成连接,查询时自然找不到数据。
修复:
const serverInit = async () => { try { await connectDB(process.env.MONGODB_URL); // 添加await等待连接完成 app.listen(8080, () => console.log('server on 8080')) } catch (error) { console.log(error) } }
2. 集合名称配置错误
Schema中指定的collection: 'app-data.albums'会被Mongoose识别为单个集合名,而不是app-data数据库下的albums集合。正确的做法是在连接URL中指定数据库,集合名只写albums。
修复:
- 确保你的
MONGODB_URL格式为:mongodb://localhost:27017/app-data(末尾指定数据库app-data) - 修改Schema的集合配置:
const AlbumSchema = new mongoose.Schema({ // 字段定义不变 }, { collection: 'albums' }) // 去掉app-data.前缀
3. Schema字段与MongoDB文档类型不匹配
检查MongoDB中的实际文档,确保字段类型和Schema完全一致:
khz、bitrate等数值字段是否为Number类型,而非字符串parental是否为布尔值(true/false),而非字符串"true"/"false"
4. 查询参数处理问题
如果req.query._end不存在,会传递undefined给limit,虽然Mongoose会忽略,但可以添加默认值避免意外:
const albums = await Album.find({}).limit(parseInt(req.query._end) || 100) // 添加默认值
内容的提问来源于stack exchange,提问作者CakeoftheCup
相关产品推荐
相关产品推荐

