it-swarm.com.de

Das Modell kann nach dem Kompilieren von Mongoose nicht überschrieben werden

Nicht sicher, was ich falsch mache, hier ist meine check.js

var db = mongoose.createConnection('localhost', 'event-db');
db.on('error', console.error.bind(console, 'connection error:'));

var a1= db.once('open',function(){
var user = mongoose.model('users',{ 
       name:String,
       email:String,
       password:String,
       phone:Number,
      _enabled:Boolean
     });

user.find({},{},function (err, users) {
    mongoose.connection.close();
    console.log("Username supplied"+username);
    //doSomethingHere })
    });

und hier ist meine insert.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/event-db')

var user = mongoose.model('users',{
     name:String,
     email:String,
     password: String,
     phone:Number,
     _enabled:Boolean
   });

var new_user = new user({
     name:req.body.name,
     email: req.body.email,
     password: req.body.password,
     phone: req.body.phone,
     _enabled:false
   });

new_user.save(function(err){
    if(err) console.log(err); 
   });

Immer wenn ich check.js ausführen möchte, erhalte ich diesen Fehler

Kann 'Benutzermodell nicht einmal überschrieben überschreiben .

Ich verstehe, dass dieser Fehler auf ein falsches Schema zurückzuführen ist, aber ich kann nicht erkennen, wo dies geschieht. Ich bin ziemlich neu in Mungo und nodeJS.

Folgendes bekomme ich von der Client-Schnittstelle meiner MongoDB: 

MongoDB Shell version: 2.4.6 connecting to: test 
> use event-db 
  switched to db event-db 
> db.users.find() 
  { "_id" : ObjectId("52457d8718f83293205aaa95"), 
    "name" : "MyName", 
    "email" : "[email protected]", 
    "password" : "myPassword", 
    "phone" : 900001123, 
    "_enable" : true 
  } 
>
63
Anathema.Imbued

Der Fehler tritt auf, weil Sie bereits ein Schema definiert haben und dann das Schema erneut definieren. Im Allgemeinen sollten Sie das Schema einmal instanziieren und dann von einem globalen Objekt aufrufen, wenn es benötigt wird. 

Zum Beispiel:

user_model.js

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

var userSchema = new Schema({
   name:String,
   email:String,
   password:String,
   phone:Number,
   _enabled:Boolean
});
module.exports = mongoose.model('users', userSchema);          

check.js

var mongoose = require('mongoose');
var User = require('./user_model.js');

var db = mongoose.createConnection('localhost', 'event-db');
db.on('error', console.error.bind(console, 'connection error:'));
var a1= db.once('open',function(){
  User.find({},{},function (err, users) {
    mongoose.connection.close();
    console.log("Username supplied"+username);
    //doSomethingHere 
  })
});

insert.js

var mongoose = require('mongoose');
var User = require('./user_model.js');

mongoose.connect('mongodb://localhost/event-db');
var new_user = new User({
    name:req.body.name
  , email: req.body.email
  , password: req.body.password
  , phone: req.body.phone
  , _enabled:false 
});
new_user.save(function(err){
  if(err) console.log(err); 
});
77
thtsigma

Ein weiterer Grund, warum Sie diesen Fehler erhalten könnten, ist, wenn Sie dasselbe Modell in verschiedenen Dateien verwenden, der Pfad require jedoch einen anderen Fall hat. Zum Beispiel in meiner Situation hatte ich:

require('./models/User') in einer Datei und dann in einer anderen Datei, wo ich Zugriff auf das Benutzermodell benötigte, das ich require('./models/user') hatte.

Ich schätze, die Suche nach Modulen & mongoose behandelt sie als eine andere Datei. Nachdem ich sichergestellt hatte, dass der Fall in beiden Fällen übereinstimmte, war dies kein Problem mehr.

122
jonnie

Ich hatte dieses Problem beim Komponententest.

Wenn Sie die Modellerstellungsfunktion zum ersten Mal aufrufen, speichert mongoose das Modell unter dem von Ihnen angegebenen Schlüssel (z. B. "Benutzer"). Wenn Sie die Modellerstellungsfunktion mit derselben Taste mehr als einmal aufrufen, können Sie das vorhandene Modell nicht mit Mongoose überschreiben.

Sie können mit dem folgenden Befehl überprüfen, ob das Modell bereits in Mungo existiert:

let users = mongoose.model('users')

Wenn das Modell nicht vorhanden ist, wird ein Fehler ausgegeben. Sie können es also in try/catch einfassen, um entweder das Modell abzurufen oder es zu erstellen:

let users
try {
  users = mongoose.model('users')
} catch (error) {
  users = mongoose.model('users', <UsersSchema...>)
}
29
BJ Anderson

Ich hatte dieses Problem während des "Beobachtens" von Tests. Wenn die Tests bearbeitet wurden, führte die Uhr die Tests erneut aus, aber aus diesem Grund scheiterten sie.

Ich habe es repariert, indem ich überprüfe, ob das Modell existiert, es dann verwenden, sonst erstellen Sie es.

import mongoose from 'mongoose';
import user from './schemas/user';

export const User = mongoose.models.User || mongoose.model('User', user);
24
ZephDavies

Ich habe dieses Problem festgestellt und es lag nicht an den Schemadefinitionen, sondern eher an dem serverlosen Offline-Modus. Ich habe es gerade so gelöst:

serverless offline --skipCacheInvalidation

Welches wird hier erwähnt https://github.com/dherault/serverless-offline/issues/258

Hoffentlich hilft das jemand anderen, der sein Projekt im Serverless-Modus erstellt und den Offline-Modus ausführt.

15
user5301210

Wenn Sie es hier gemacht haben, ist es möglich, dass Sie dasselbe Problem hatten wie ich ... Mein Problem war, dass ich ein anderes Modell mit demselben Namen definierte. Ich habe meine Galerie und mein Dateimodell "Datei" genannt. Verdammt, kopieren und einfügen!

11

Das ist mir passiert, wenn ich so schreibe:

import User from '../myuser/User.js';

Der wahre Pfad ist jedoch "../myUser/User.js".

6
ip192

Wenn Sie Serverless offline verwenden und --skipCacheInvalidation nicht verwenden möchten, können Sie Folgendes sehr gut verwenden:

module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
4
Julian

Ich weiß, dass es eine akzeptierte Lösung gibt, aber ich glaube, dass die aktuelle Lösung viel Boilerplate ergibt, nur damit Sie Modelle testen können. Meine Lösung besteht im Wesentlichen darin, dass Sie das Modell in eine Funktion aufnehmen und es innerhalb einer Funktion platzieren. Dadurch wird das neue Modell zurückgegeben, wenn das Modell nicht registriert wurde, und das vorhandene Modell, falls vorhanden.

function getDemo () {
  // Create your Schema
  const DemoSchema = new mongoose.Schema({
    name: String,
    email: String
  }, {
    collection: 'demo'
  })
  // Check to see if the model has been registered with mongoose
  // if it exists return that model
  if (mongoose.models && mongoose.models.Demo) return mongoose.models.Demo
  // if no current model exists register and return new model
  return mongoose.model('Demo', DemoSchema)
}

export const Demo = getDemo()

Das Öffnen und Schließen von Verbindungen überall ist frustrierend und komprimiert nicht gut.

Wenn ich also das Modell an zwei verschiedenen Stellen oder genauer in meinen Tests benötige, würde ich keine Fehler erhalten und alle korrekten Informationen werden zurückgegeben.

3
Moosecouture

Um dieses Problem zu lösen, überprüfen Sie, ob das Modell vorhanden ist, bevor Sie die Erstellung durchführen:

if (!mongoose.models[entityDBName]) {
  return mongoose.model(entityDBName, entitySchema);
}
else {
  return mongoose.models[entityDBName];
}
1
Alpha BA

Die Schemadefinition sollte für eine Auflistung eindeutig sein. Es sollte nicht mehr als ein Schema für eine Auflistung sein.

0
KARTHIKEYAN.A

Sie können dieses Problem ganz einfach lösen 

delete mongoose.connection.models['users'];
const usersSchema = mongoose.Schema({...});
export default mongoose.model('users', usersSchema);
0
pihyper

weil Ihr Schema bereits vorhanden ist, überprüfen Sie es, bevor Sie ein neues Schema erstellen.

var mongoose = require('mongoose');
module.exports = function () {
var db = require("../libs/db-connection")();
//schema de mongoose
var Schema = require("mongoose").Schema;

var Task = Schema({
    field1: String,
    field2: String,
    field3: Number,
    field4: Boolean,
    field5: Date
})

if(mongoose.models && mongoose.models.tasks) return mongoose.models.tasks;

return mongoose.model('tasks', Task);

Dieses Problem kann auftreten, wenn Sie zwei verschiedene Schemas mit demselben Sammlungsnamen definieren

0
The reason of this issue is: 

you given the model name "users" in the line 
<<<var user = mongoose.model('users' {>>> in check.js file

and again the same model name you are giving in the insert file
<<< var user = mongoose.model('users',{ >>> in insert.js

This "users" name shouldn't be same when you declare a model that should be different 
in a same project.
0
Rohit Jangid

Ich habe dies durch Hinzufügen gelöst

mongoose.models = {}

vor der Zeile: 

mongoose.model(<MODEL_NAME>, <MODEL_SCHEMA>)

Hoffe, es löst dein Problem

0
Toufiq
If you want to overwrite the existing class for different collection using TypeScript
then you have to inherit the existing class from different class.

export class User extends Typegoose{
  @prop
  username?:string
  password?:string
}


export class newUser extends User{
    constructor() {
        super();
    }
}

export const UserModel = new User ().getModelForClass(User , { schemaOptions: { collection: "collection1" } });

export const newUserModel = new newUser ().getModelForClass(newUser , { schemaOptions: { collection: "collection2" } });
0
Rohit Jangid

Ich habe eine Situation, in der ich das Modell bei jeder Anforderung dynamisch erstellen muss. Daher erhielt ich diesen Fehler. Was ich jedoch zur Behebung dieses Problems verwendet habe, ist die deleteModel -Methode wie folgt:

var contentType = 'Product'

var contentSchema = new mongoose.Schema(schema, virtuals);

var model = mongoose.model(contentType, contentSchema);

mongoose.deleteModel(contentType);

Ich hoffe, das kann jedem helfen.

0
Engr.MTH