使用TypeScript结合Mongoose无法获取MongoDB数据的问题
无法从MongoDB获取Topic数据(返回空数组但数据库存在文档)
我正在开发Angular项目,后端采用TypeScript编写,调用获取所有Topic集合文档的接口时返回空数组[],但数据库中确实存在一条Topic文档。已定义Topic模型及对应路由接口,相关代码和数据库文档如下:
模型代码
import { Document, Schema, Types, model } from "mongoose"; export interface ITopic extends Document { title: string, questions: Types.ObjectId[] } const topicSchema: Schema = new Schema({ title: { type: String, required: true }, questions: { type: [Types.ObjectId], required: true, default: [] } }) export const Topic = model<ITopic>('Topic', topicSchema)
路由代码
import { Router } from 'express' import { Topic, ITopic } from '../models/topicModel' export const topicsRoute = Router() topicsRoute.get('/all', async (req, res) => { const topics : any = await Topic.find() console.log(topics); if (!topics){ return res.status(400).json({error: '未找到主题'}) } res.status(200).json(topics) })
数据库现有文档
{ "_id": { "$oid": "64a51c6a5e4cc90e2b2fede4" }, "title": "Общие положения", "questions": [ "64a51d1657c8b5f41f80f020" ] }
服务器入口代码
import dotenv from 'dotenv' import mongoose from 'mongoose' import { userRouter } from './routes/userRoute' import { topicRoute } from './routes/topicRoute' dotenv.config({path: './config.env'}) const PORT = process.env.PORT const app = express() app.use(cors()) app.use(express.json()) app.use('/user', userRouter) app.use('/topic', topicRoute) app.listen(PORT, () =>{ mongoose.connect(process.env.DATABASE_URL || '') .then(() => { console.log(`Server is running on ports: ${PORT}`) }) .catch(err => console.log(err)) })
排查与解决方法
集合名称不匹配:Mongoose默认会将模型名转为小写复数作为集合名。你定义的模型是
Topic,Mongoose会自动对应topics集合,但如果数据库里的集合是Topic(首字母大写或单数),就会查询不到数据。- 解决:要么在定义模型时显式指定集合名:
model<ITopic>('Topic', topicSchema, 'Topic')(第三个参数为实际集合名);要么将数据库中的集合重命名为topics。
- 解决:要么在定义模型时显式指定集合名:
验证数据库连接目标:确认
config.env中的DATABASE_URL指向的是正确的数据库,避免连接到测试库或其他无关库。可以在连接成功后打印当前数据库名称验证:mongoose.connect(process.env.DATABASE_URL || '') .then((conn) => { console.log(`已连接数据库:${conn.connection.db.databaseName}`); console.log(`服务器运行在端口:${PORT}`); })检查Schema与文档字段匹配:数据库文档中的
questions是字符串数组,而Schema定义的是[Types.ObjectId]类型。虽然Mongoose会尝试自动转换,但可以临时关闭严格模式验证查询结果:const topics = await Topic.find().setOptions({ strict: false });添加异步错误捕获:当前路由代码未处理
Topic.find()的异常,查询出错时无法定位问题,建议加上try-catch:topicsRoute.get('/all', async (req, res) => { try { const topics = await Topic.find(); console.log(topics); res.status(200).json(topics); } catch (err) { console.error('查询错误:', err); res.status(500).json({ error: '查询主题失败' }); } })
内容的提问来源于stack exchange,提问作者Roman Nichi
相关产品推荐
相关产品推荐

