TypeORM配合MongoDB执行save/insert后数据未入库且find报错
修复方案
核心错误原因
你遇到的Cannot read property 'prototype' of undefined错误,以及集合不生成但统计数递增的问题,基本都是TypeORM MongoDB场景下的实体元数据解析错误、异步时序问题两类原因导致,按以下步骤修复即可:
1. 修正实体的导入依赖
这是触发原型读取错误的最高发原因,请确保File实体的导入语句完全正确:
// 从typeorm导入装饰器 import { Entity, Column, ObjectIdColumn } from "typeorm"; // 从mongodb包导入ObjectID类型 import { ObjectID } from "mongodb";
如果错误导入了其他包下的ObjectIdColumn或ObjectID,会导致TypeORM解析实体结构时读取原型失败。
2. 调整异步代码写法
你当前的回调嵌套写法容易出现异步时序遗漏,统一使用async/await改写业务逻辑,避免异步操作未完成就执行后续查询:
import * as fs from "fs"; async function saveFileEntry(filePath: string) { const manager = (await mongoConnection).mongoManager; console.log((await manager.stats(File)).count); const file = new File(); file.filePath = filePath; file.fileSize = fs.statSync(filePath).size; try { // 等待保存操作完成再执行查询 const savedFile = await manager.save(file); console.log("Saved file:", savedFile); const files = await manager.find(File); files.forEach(item => console.log("Found file:", item)); } catch (error) { console.log(`操作失败: ${error}`); } }
3. 验证连接与集合生成逻辑
- 确认MongoDB Compass中查看的是配置里指定的
test数据库,避免切换错库看不到集合 synchronize: true配置在MongoDB下不会主动创建空集合,集合会在第一条数据成功写入后自动生成- 查看TypeORM控制台的操作日志,确认写入的集合名是否为你配置的
files
4. 兼容性替代方案:使用MongoRepository
如果MongoManager的find方法持续报错,可以改用MongoRepository实现数据操作,对MongoDB的兼容性更好:
async function saveFileEntry(filePath: string) { const connection = await mongoConnection; const fileRepo = connection.getMongoRepository(File); console.log((await fileRepo.stats()).count); const file = new File(); file.filePath = filePath; file.fileSize = fs.statSync(filePath).size; try { const savedFile = await fileRepo.save(file); console.log("Saved file:", savedFile); const files = await fileRepo.find(); files.forEach(item => console.log("Found file:", item)); } catch (error) { console.log(`操作失败: ${error}`); } }
内容的提问来源于stack exchange,提问作者thanat0sis
相关产品推荐
相关产品推荐

