繁体   English   中英

猫鼬错误需要模型

[英]Mongoose error requiring a model

我对NodeJS有一个相当奇怪的问题,require和mongoose。 我为用户模型创建了一个架构,如下所示:

let mongoose = require('mongoose');
let Schema = mongoose.Schema;

let depositSchema = new Schema({
    customer: String,
    tyres : {
        amount: { type: Number, min: 1, required : true},
        tyreType : { type: String, required : true }
    },
    created : {
        at : { type: Date, default : Date.now },
        by : { type : Schema.ObjectId }
    },
    last_modified : {
        at : { type: Date },
        by : { type: Schema.ObjectId }
    },
    located_at : {
        column: { type: String, required : true },
        row: { type: String, required : true }
    }
});

depositSchema.pre('save', function(next) {
    let date = new Date();

    this.last_modified.at = date;

    if(!this.created.at) {
        this.created.at = date;
    }

    next();
});

module.exports = mongoose.model('Deposit', depositSchema);

因此,您可以看到文件导出了猫鼬模型。 如果我在另一个这样的文件中需要此文件:

let Deposit = require('../../models/deposit);

一切顺利。 一切正常,使用模型并从中创建对象以将其保存在Mongo中,我没有任何问题。

但是,如果我需要这样的模型:

let Deposit = require('../../models/Deposit);

我从Mongo收到此错误:

    /app/node_modules/mongoose/lib/index.js:376
      throw new mongoose.Error.OverwriteModelError(name);
      ^
MongooseError: Cannot overwrite `Deposit` model once compiled.

我需要模型的线上有错误点。

我搜索了与require类似的问题,但没有找到任何有用的解释我问题的信息。 另一个模型也会出现相同的问题,但拼写方向不同。 我很困扰。 也许有人遇到了相同的问题,或者能够解释发生了什么/发生了什么以及导致问题的原因。

先感谢您。

祝大家有个成功的一周。

 var  mongoose = require('mongoose');
 let Deposit = mongoose.model('Deposit');

改用上述两行: let Deposit = require('../../models/deposit');

问题在于节点要求缓存不知道../../models/deposit../../models/Deposit实际上是同一文件。

如果知道它们是正确的,则它将不会再次加载并执行该文件,而是从第一次加载时返回先前导出的值(存储在缓存中)。

但是,由于它看到这些文件不同,因此它将加载并执行两次文件,并且第二次将引发错误(因为它两次运行“ create-a-model”代码,而Mongoose不会) t喜欢)。

有一些解决方法,但最终,每次require()文件时,都应使用正确的文件名(在Finder / Explorer /任何文件中的显示方式)。

我相信问题是您在此代码module.exports = mongoose.model('Deposit', depositSchema);行上定义了一个名为Deposit的模型module.exports = mongoose.model('Deposit', depositSchema); 然后您尝试使用具有相同名称Deposit的变量再次重新定义它。

您是否尝试做类似var deposit = requrire(../../models/deposit);

我尝试了Israel.zinc的建议,并在出口行的“ Deposit1”中重命名了存款模型。 之后,我试图像这样要求它:

let Deposit = require('../../models/Deposit'); 

并收到了完全相同的猫鼬错误,但提示“无法覆盖'Deposit1'...”,如果我这样要求它:

let Deposit = require('../../models/deposit');

一切正常...

您要在其中定义用户模型的文件的名称是什么? 我认为这可能只是您要求的文件名错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM