You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:20:36