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

TypeORM对接MongoDB调用Repository的find方法报prototype undefined错误

报错触发原因

这个错误在TypeORM对接MongoDB的场景下,基本由以下三个常见问题导致:

  1. API和TypeORM版本不匹配:如果使用的是0.3.x及以上版本的TypeORM,原有的全局getMongoRepository方法已经被官方移除,继续调用会导致仓库实例初始化异常,调用原型方法时报错。
  2. Task实体配置错误:MongoDB的实体需要使用专属的@ObjectIdColumn装饰器声明主键,如果误用了关系型数据库的@PrimaryColumn/@PrimaryGeneratedColumn装饰器,或者实体未加@Entity()装饰器,会导致TypeORM无法正确解析实体原型。
  3. 实体未注册到TypeORM配置:连接配置的entities字段未包含Task实体的加载路径,导致获取到的是未完成初始化的空实例。

解决步骤

  1. 适配对应版本的API
    • 如果使用TypeORM 0.2.x版本:确认全局getMongoRepository可用,检查连接配置的正确性即可。
    • 如果使用TypeORM 0.3.x版本:请将初始化连接的数据源实例导出,从实例获取仓库,示例如下:
      首先修改server.ts的连接逻辑(同时修正你现有代码里先赋值后声明task的笔误):
    import express from 'express';
    // 0.3.x版本用createDataSource代替createConnection
    import { createDataSource, DataSource } from 'typeorm'
    import Task from "./models/Task";
    
    const app = express();
    const port = 3333;
    
    // 导出数据源实例供其他模块调用
    export const appDataSource = new DataSource({
      // 此处替换为你自己的MongoDB连接配置
      type: "mongodb",
      host: "localhost",
      port: 27017,
      database: "你的数据库名",
      entities: [Task],
      synchronize: true,
    })
    // 初始化连接
    appDataSource.initialize()
    
    app.use(express.json());
    
    app.post('/tasks', (async (request, response) => {
      const { item } = request.body;
      const task = new Task();
      task.item = item;
      await appDataSource.mongoManager.save(task);
      return response.send(task);
    }))
    
    app.listen(port, () =>
      console.log(`Server running on port ${port}`)
    );
    
    然后修改控制器的仓库获取逻辑:
    import { Request, Response } from 'express';
    // 引入导出的数据源实例
    import { appDataSource } from '../server';
    import Task from "../models/Task";
    
    export default class TasksController {
    async listAll(request: Request, response: Response): Promise<Response> {
        const tasksRepository = appDataSource.getMongoRepository(Task);
        try {
          const tasks = await tasksRepository.find();
          return response.status(200).json({ "items": tasks });
        } catch (err) {
          return response.status(400).json({
            message: err.message,
          });
        }
      }
    }
    
  2. 修正Task实体配置
    确保实体使用MongoDB专属装饰器,示例:
    import { Entity, ObjectIdColumn, ObjectId, Column } from 'typeorm';
    
    @Entity()
    export default class Task {
      @ObjectIdColumn()
      id: ObjectId;
    
      @Column()
      item: string;
      // 其他字段按需添加
    }
    
  3. 核对实体注册配置
    确保DataSource配置中的entities数组包含了Task实体,或者配置的扫描路径能正确加载到Task实体文件。

内容的提问来源于stack exchange,提问作者Rafael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:27:03