Mongoose 错误:尚未为模型“名称”注册架构。使用 mongoose.model(名称, schema)

问题描述 投票:0回答:2
我有两个型号。在第一个模型上,我有一个虚拟字段,应该由另一个字段填充(一对多关系)。而且它不起作用。

型号一:

import { Schema, model } from 'mongoose'; const vendorSchema = new Schema<VendorProps>({ company_name: String, product_type: String, }, { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true }, }); vendorSchema.virtual('campaigns', { ref: 'campaign', foreignField: 'vendor_id', localField: '_id' }); const Vendor = model<VendorProps>( 'Vendor', vendorSchema ); export default Vendor;
型号二:

import { Schema, model } from 'mongoose'; const campaignSchema = new Schema<CampaignProps>({ lead_volume: Number, cost_per_credit_score: String, vendor_id: { type: Schema.ObjectId, ref: 'Vendor', }, }, { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true }, }); const Campaign = model<CampaignProps>( 'campaign', campaignSchema ); export default Campaign;
(我省略了 Props,因为它们是 .ts 文件)

index

 文件中,我导入引用以下控制器方法的路由:

import VendorModel from '../models/vendor'; await VendorModel.findById(id).populate('campaigns').exec();
我至少有 12 个其他类似的模型,它们的工作方式完全相同。 (当我创建这两个 + 控制器时,我只是逐字复制/粘贴并修改名称)
但由于某种原因,当我通过 ID 查询供应商类型时,它给出了标题错误。

我完全被难住了。 (我在这里查看了一些其他类似的线程,但没有一个可以帮助我,因为我认为我的代码实际上没有任何问题,它应该可以工作)

有什么想法吗?

mongoose mongoose-schema mongoose-populate
2个回答
4
投票
所以我无意中发现了为什么这不起作用。

Campaign

 模型在任何地方都没有 
used
(除了填充查询中)。

创建后,我将模型添加到现有路线(作为查询),代码起作用了。所以基本上模型不是“

registered

”,所以模型一引用了一个不存在的模型(如果你问猫鼬,我们就是)。

tl:博士;您必须在代码中引用模型才能使虚拟字段发挥作用。


0
投票
感谢lordZ3d的最高分回答我解决了它。我正在调试,但无法传递我的产品型号的错误。

之前:

import basketModel from "../models/Basket"; import database from ".."; const getOrderBasket = async (id: string) => { const basket = await basketModel .findOne({ _id: id }) .populate(["products"]) .lean(); console.log(JSON.stringify(basket, null, 2)); }; (async () => { try { database; await getOrderBasket("..."); } catch (error) { console.error(error); } finally { database.close(); } })();
之后:

import basketModel from "../models/Basket"; import Product from "../models/Product"; // import models import database from ".."; const getOrderBasket = async (id: string) => { Product; // here const basket = await basketModel .findOne({ _id: id }) .populate(["products"]) .lean(); console.log(JSON.stringify(basket, null, 2)); }; (async () => { try { database; await getOrderBasket("..."); } catch (error) { console.error(error); } finally { database.close(); } })();
    
© www.soinside.com 2019 - 2024. All rights reserved.