TypeORM对接MongoDB调用Repository的find方法报prototype undefined错误
报错触发原因
这个错误在TypeORM对接MongoDB的场景下,基本由以下三个常见问题导致:
- API和TypeORM版本不匹配:如果使用的是0.3.x及以上版本的TypeORM,原有的全局
getMongoRepository方法已经被官方移除,继续调用会导致仓库实例初始化异常,调用原型方法时报错。 - Task实体配置错误:MongoDB的实体需要使用专属的
@ObjectIdColumn装饰器声明主键,如果误用了关系型数据库的@PrimaryColumn/@PrimaryGeneratedColumn装饰器,或者实体未加@Entity()装饰器,会导致TypeORM无法正确解析实体原型。 - 实体未注册到TypeORM配置:连接配置的
entities字段未包含Task实体的加载路径,导致获取到的是未完成初始化的空实例。
解决步骤
- 适配对应版本的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, }); } } } - 如果使用TypeORM 0.2.x版本:确认全局
- 修正Task实体配置
确保实体使用MongoDB专属装饰器,示例:import { Entity, ObjectIdColumn, ObjectId, Column } from 'typeorm'; @Entity() export default class Task { @ObjectIdColumn() id: ObjectId; @Column() item: string; // 其他字段按需添加 } - 核对实体注册配置
确保DataSource配置中的entities数组包含了Task实体,或者配置的扫描路径能正确加载到Task实体文件。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

