No estoy seguro de lo que estoy haciendo mal, aquí está mi 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 })
});
y aquí está mi 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);
});
Siempre que intento ejecutar check.js, aparece este error
No se puede sobrescribir el modelo de 'usuarios' una vez compilado .
Entiendo que este error se debe a que el esquema no coincide, pero no puedo ver dónde está sucediendo. Soy bastante nuevo en mangosta y nodeJS.
Esto es lo que obtengo de la interfaz de cliente de mi 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
}
>
Respuestas:
El error se produce porque ya tiene un esquema definido y luego está definiendo el esquema nuevamente. Generalmente, lo que debe hacer es crear una instancia del esquema una vez y luego hacer que un objeto global lo llame cuando lo necesite.
Por ejemplo:
user_model.js
check.js
insert.js
fuente
ref
s para otros modelos, esto puede llevar a una pesadilla de dependencia. Utilizar envar User = mongoose.model('user')
lugar derequire
.Entonces, otra razón por la que puede obtener este error es si usa el mismo modelo en diferentes archivos pero su
require
ruta tiene un caso diferente. Por ejemplo en mi situación tuve:require('./models/User')
en un archivo y luego en otro archivo donde necesitaba acceder al modelo de usuario que teníarequire('./models/user')
.Supongo que la búsqueda de módulos y mangosta lo trata como un archivo diferente. Una vez que me aseguré de que el caso coincidiera en ambos, ya no fue un problema.
fuente
Tuve este problema durante la prueba unitaria.
La primera vez que llama a la función de creación de modelo, mangosta almacena el modelo bajo la clave que usted proporciona (por ejemplo, 'usuarios'). Si llama a la función de creación del modelo con la misma clave más de una vez, la mangosta no le permitirá sobrescribir el modelo existente.
Puedes comprobar si el modelo ya existe en mangosta con:
Esto arrojará un error si el modelo no existe, por lo que puede envolverlo en un intento / captura para obtener el modelo o crearlo:
fuente
try exports.getModel = ()-> mongoose.model('User', userSchema) catch err exports.getModel = ()-> mongoose.model('User')
Tuve este problema mientras 'miraba' las pruebas. Cuando se editaron las pruebas, el reloj volvió a ejecutar las pruebas, pero fallaron debido a esta misma razón.
Lo arreglé verificando si el modelo existe y luego lo usé, de lo contrario, créelo.
fuente
module.export = User
aexport defaults User
. También tuverefs
que User de otros modelos. No estoy seguro de por qué el cambio demodule.exports
aexport default
trajo este problema. Sin embargo, esta respuesta parece haberlo solucionado.mongoose.models
no existe, al menos en versiones recientesfor (let model in mongoose.models) delete mongoose.models[model]
"test": "NODE_ENV=test mocha --file mocha.config.js --watch"
y en ese archivo js de configuración tengo unbefore()
yafter()
para manejar la configuración y el desmontaje. @ E.Sundin proporcionó la solución perfecta aquí, y funciona de maravilla. ¡Gracias!He estado experimentando este problema y no fue por las definiciones del esquema, sino por el modo fuera de línea sin servidor; simplemente logré resolverlo con esto:
Que se menciona aquí https://github.com/dherault/serverless-offline/issues/258
Con suerte, eso ayudará a alguien más que esté construyendo su proyecto en modo sin servidor y sin conexión.
fuente
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
Si está utilizando Serverless sin conexión y no desea utilizarlo
--skipCacheInvalidation
, puede utilizar:fuente
--skipCacheInvalidation
Si llegó aquí, es posible que haya tenido el mismo problema que yo. Mi problema fue que estaba definiendo otro modelo con el mismo nombre . Llamé a mi galería y mi modelo de archivo "Archivo". ¡Maldita sea, copia y pega!
fuente
Esto me pasó a mí cuando escribo así:
Sin embargo, la verdadera ruta es '../myUser/User.js'
fuente
Resolví esto agregando
antes de la línea:
Espero que resuelva tu problema
fuente
mongoose.connection.models = {};
Para resolver esta comprobación si el modelo existe antes de realizar la creación:
fuente
Sé que hay una solución aceptada, pero creo que la solución actual da como resultado una gran cantidad de texto estándar solo para que pueda probar los modelos. Mi solución es esencialmente tomar su modelo y colocarlo dentro de una función, lo que resulta en devolver el nuevo modelo si el modelo no se ha registrado, pero devolver el modelo existente si lo ha hecho.
Abrir y cerrar conexiones por todas partes es frustrante y no se comprime bien.
De esta manera, si requiriera el modelo en dos lugares diferentes o más específicamente en mis pruebas, no obtendría errores y se devuelve toda la información correcta.
fuente
Este problema puede ocurrir si define 2 esquemas diferentes con el mismo nombre de colección
fuente
fuente
Tuve el mismo problema, la razón fue que definí el esquema de un modelo en una función JS, deberían definirse globalmente en un módulo de nodo, no en una función.
fuente
Hay otra forma de lanzar este error.
Tenga en cuenta que la ruta al modelo distingue entre mayúsculas y minúsculas.
En este ejemplo similar que involucra el modelo "Categoría", el error se produjo en estas condiciones:
1) La declaración require se mencionó en dos archivos: ..category.js y ..index.js 2) En el primero, el caso era correcto, en el segundo archivo no era el siguiente:
category.js
index.js
fuente
La definición de esquema debe ser única para una colección, no debe ser más de un esquema para una colección.
fuente
es porque su esquema ya está, valide antes de crear un nuevo esquema.
fuente
Puede resolver esto fácilmente haciendo
fuente
Tengo una situación en la que tengo que crear el modelo dinámicamente con cada solicitud y debido a eso recibí este error, sin embargo, lo que usé para solucionarlo es usar el método deleteModel como el siguiente:
Espero que esto pueda ayudar a cualquiera.
fuente
fuente
Para todas las personas que terminan aquí debido a una base de código con una mezcla de Typegoose y Mongoose :
Cree una conexión de base de datos para cada uno:
Mangosta:
Tipo ganso:
fuente
Solo tengo un error al copiar y pegar. En una línea tenía el mismo nombre que en otro modelo (modelo de anuncio):
Correcto es:
Por cierto, si alguien tiene "guardado automático" y usa el índice para consultas como:
Tiene que eliminar el índice y reescribir para el modelo correcto:
fuente
Resolví este problema haciendo esto
Luego en otros archivos
Mejor solucion
Espero que esto ayude...
fuente
Dado que este problema ocurrió porque llamar al modelo en otro momento. Solucione este problema ajustando el código de su modelo en el bloque try catch. el código mecanografiado es así:
Del mismo modo, también puede escribir código en js.
fuente
Estás usando mongoose.model con el mismo nombre de variable "usuario" en check.js e insert.js.
fuente
Si está trabajando con expressjs, es posible que deba mover la definición de su modelo fuera de app.get (), por lo que solo se llama una vez cuando se crea una instancia del script.
fuente