2017-02-22 5 views
0

У меня довольно странная проблема с NodeJS, require и mongoose. Я создал схему для модели пользователя, как это:Ошибка 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); 

Все в порядке. Все работает, и у меня нет проблем с использованием модели и создания объектов из нее, чтобы сохранить ее в Монго.

Но если мне нужна модель, как это:

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

Я получаю эту ошибку из Монго:

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

точки ошибок на линии я требует модель.

Я искал похожие проблемы с требованием, но не нашел ничего полезного, что объясняет мою проблему. Та же проблема возникает с другой моделью, но в другом направлении в орфографии. Я очень смущен. Может быть, у кого-то была одна и та же проблема или она может объяснить, что происходит/произошло и что вызвало проблему.

Заранее спасибо.

Успешная неделя.

ответ

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

использование выше двухлинейные вместо: let Deposit = require('../../models/deposit');

+0

Спасибо @ Love-Kesh за ваш ответ. Он работает нормально. Я хотел бы знать, где фактическая разница между двумя способами получения модели? Тот, который я использовал, используется многими людьми, которые пишут это в своих блогах и учебниках. – W0RLDB47ANCE

+0

Вы определили модель, используя mongoose.model («Депозит», depositSchema); нет необходимости повторять это снова. При использовании требуется, чтобы ваш файл выполнял выполнение каждый раз, когда вы когда-либо используете. Таким образом, способ получить это: let Deposit = mongoose.model («Депозит»); –

+0

Хорошо, хорошо это знать. Большое спасибо за ваш ответ и объяснение. – W0RLDB47ANCE

0

Я считаю, что проблема заключается в том, что вы определяете модель под названием «Депозит» на этой строке кода module.exports = mongoose.model('Deposit', depositSchema);, а затем вы пытаетесь переопределить ее снова, используя переменную с тем же именем Deposit.

Вы пытались сделать что-то вроде var deposit = requrire(../../models/deposit);?

+0

Спасибо за ваш быстрый ответ. Я попробовал его с var, но получил ту же проблему. У меня есть модель пользователя, которая спроектирована как модель депозита, и я попробовал ее с помощью var и разных типов орфографии (нижний/верхний), но получил ту же ошибку от mongo ... – W0RLDB47ANCE

+0

Проблема не в var, это нижняя case в имени переменной. –

+0

Требование модели депозита В настоящее время я использую правописание на нижнем регистре, поскольку оно работает только так. – W0RLDB47ANCE

0

Я попробовал то, что предложил Israel.zinc и переименовал модель депозита в «Депозит1» в строке экспорта. Потом я пытался требовать его как этот:

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

И получил ту же самую ошибку Mongoose за исключением того, говоря: «Не могу перезаписать„Deposit1“...» Если я требую это так:

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

Все работает нормально ...

0

какое имя файла, в котором вы определяете свой usermodel ?? на мой взгляд, это может быть только имя файла, вы требуя неправильно

+0

Это «user.js», и для депозита это «deposit.js», это тот момент, который я не получаю, было бы очевидно, если бы я назвал их по-другому, но оба они строчные, а то же самое экспортируется в верхнем регистре. .. – W0RLDB47ANCE

1

Проблема заключается в том, что узел требует кэш не знает, что ../../models/deposit и ../../models/Deposit на самом деле тот же файл.

Если бы он знал, что они есть, он бы не загрузил и не выполнил файл снова, а вместо этого возвратил предыдущее экспортированное значение с первого раза, когда он был загружен (который хранится в кеше).

Однако, поскольку он видит, что эти файлы отличаются друг от друга, он будет загружать и выполнять файл дважды, а второй раз вызывает ошибку (потому что он дважды запускает код «create-a-model», которого Мангуст не любит).

Существует несколько обходных путей, но в конечном итоге вы должны использовать правильное имя файла (как оно отображается в Finder/Explorer/whatever) каждый раз, когда вы require() файла.

+0

Я думаю, что это правильный ответ. В моем случае мне требовался один и тот же файл двумя разными способами (один раз с относительным URL-адресом, изнутри пакета и один раз с именем пакета, из-за пределов пакета), а в кэше требований должно было быть указано, что это два разных файла , –

Смежные вопросы