J'ai une méthode commune pour mettre à jour un document de n'importe quelle collection dans MongoDB?
Le code suivant est dans le nom de fichier Deleter.js
module.exports.MongooseDelete = function (schemaObj, ModelObject);
{
var ModelObj = new mongoose.Model("collectionName",schemaObj);
ModelObj.remove(ModelObject);
}
Et en invoquant comme suit dans mon fichier principal app.js :
var ModObj = mongoose.model("schemaName", schemasObj);
var Model_instance = new ModObj();
var deleter = require('Deleter.js');
deleter.MongooseDelete(schemasObj,Model_instance);
Je reçois l'erreur suivante:
OverwriteModelError: Cannot overwrite `undefined` model once compiled.
at Mongoose.model (D:\Projects\MyPrjct\node_modules\mongoose\lib\index.js:4:13)
Je ne reçois que le deuxième appel de méthode .. Merci de me faire savoir si quelqu'un a une solution.
Je pense que vous avez instancié mongoose.Model()
sur le même schéma deux fois. Vous devez avoir créé chaque modèle une seule fois et disposer d'un objet global pour les récupérer en cas de besoin.
Je suppose que vous déclarez différents modèles dans différents fichiers sous le répertoire $YOURAPP/models/
$YOURAPPDIR/models/
- index.js
- A.js
- B.js
index.js
module.exports = function(includeFile){
return require('./'+includeFile);
};
A.js
module.exports = mongoose.model('A', ASchema);
B.js
module.exports = mongoose.model('B', BSchema);
dans votre app.js
APP.models = require('./models'); // a global object
Et quand vous en avez besoin
// Use A
var A = APP.models('A');
// A.find(.....
// Use B
var B = APP.models('B');
// B.find(.....
J'ai réussi à résoudre le problème comme ceci:
var Admin;
if (mongoose.models.Admin) {
Admin = mongoose.model('Admin');
} else {
Admin = mongoose.model('Admin', adminSchema);
}
module.exports = Admin;
J'essaie d'éviter autant que possible les globaux, car tout est par référence et les choses peuvent devenir compliquées. Ma solution
model.js
try {
if (mongoose.model('collectionName')) return mongoose.model('collectionName');
} catch(e) {
if (e.name === 'MissingSchemaError') {
var schema = new mongoose.Schema({ name: 'abc });
return mongoose.model('collectionName', schema);
}
}
J'ai trouvé mieux d'éviter les remises globales et d'exceptions.
var mongoose = require("mongoose");
var _ = require("underscore");
var model;
if (_.indexOf(mongoose.modelNames(), "Find")) {
var CategorySchema = new mongoose.Schema({
name: String,
subCategory: [
{
categoryCode: String,
subCategoryName: String,
code: String
}
]
}, {
collection: 'category'
});
model = mongoose.model('Category', CategorySchema);
}
else {
model = mongoose.model('Category');
}
module.exports = model;
En réalité, le problème n’est pas que mongoose.model()
soit instancié deux fois. Le problème est que la Schema
est instanciée plus d'une fois. Par exemple, si vous utilisez mongoose.model("Model", modelSchema)
n fois et que vous utilisez la même référence au schéma, cela ne poserait pas de problème pour mangouste. Le problème survient lorsque vous utilisez une autre référence de schéma sur le même modèle, à savoir
var schema1 = new mongoose.Schema(...);
mongoose.model("Model", schema1);
mongoose.model("Model", schema2);
C'est la situation lorsque cette erreur se produit.
Si vous regardez la source (mongoose/lib/index.js:360)
c'est la vérification
if (schema && schema.instanceOfSchema && schema !== this.models[name].schema){
throw new mongoose.Error.OverwriteModelError(name);
}
En effet, un modèle est requis dans deux chemins.
// Commenter le fichier modèle
var mongoose = require('mongoose')
var Schema = mongoose.Schema
var CommentSchema = Schema({
text: String,
author: String
})
module.exports = mongoose.model('Comment', CommentSchema)
// fichier Seed
const commentData = {
user: "David Lee",
text: "This is one comment"
}
var Comment = require('./models/Comment')
module.exports = function seedDB () {
Comment.create(commentData, function (err, comment) {
console.log(err, commemt)
})
}
// fichier d'index
var Comment = require('./models/comment')
var seedDB = require('./seeds')
seedDB()
const comment = {
text: 'This girl is pretty!',
author: 'David'
}
Comment.create(, function (err, comment) {
console.log(err, comment)
})
Maintenant, vous obtiendrez throw new mongoose.Error.OverwriteModelError(name)
, Parce que vous avez besoin du modèle Comment de deux manières différentes. Seed _ file var Comment = require('./models/Comment')
, Index file var Comment = require('./models/comment')