Não tenho certeza do que estou fazendo de errado, aqui está meu 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 })
});
e aqui está meu 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);
});
Sempre que tento executar check.js, recebo este erro
Não é possível sobrescrever o modelo de 'usuários' depois de compilado .
Eu entendo que esse erro ocorre devido à incompatibilidade do Schema, mas não consigo ver onde isso está acontecendo. Sou muito novo no mangusto e no nodeJS.
Aqui está o que estou obtendo da interface do cliente do meu 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
}
>
Respostas:
O erro está ocorrendo porque você já tem um esquema definido e, em seguida, está definindo o esquema novamente. Geralmente, o que você deve fazer é instanciar o esquema uma vez e, em seguida, fazer com que um objeto global o chame quando precisar.
Por exemplo:
user_model.js
check.js
insert.js
fonte
ref
outros modelos, isso pode levar a um pesadelo de dependência. Use emvar User = mongoose.model('user')
vez derequire
.Portanto, outra razão pela qual você pode obter este erro é se você usar o mesmo modelo em arquivos diferentes, mas o
require
caminho tiver um caso diferente. Por exemplo, na minha situação eu tinha:require('./models/User')
em um arquivo e depois em outro onde precisei acessar o modelo de usuário que tinharequire('./models/user')
.Acho que procurar por módulos & mongoose é tratá-lo como um arquivo diferente. Depois de ter certeza de que o caso combinava em ambos, não era mais um problema.
fonte
Eu tive esse problema durante o teste de unidade.
A primeira vez que você chama a função de criação de modelo, o mongoose armazena o modelo sob a chave que você fornece (por exemplo, 'usuários'). Se você chamar a função de criação de modelo com a mesma tecla mais de uma vez, o mongoose não permitirá que você substitua o modelo existente.
Você pode verificar se o modelo já existe no mangusto com:
Isso gerará um erro se o modelo não existir, então você pode envolvê-lo em um try / catch para obter o modelo ou criá-lo:
fonte
try exports.getModel = ()-> mongoose.model('User', userSchema) catch err exports.getModel = ()-> mongoose.model('User')
Eu tive esse problema ao 'assistir' os testes. Quando os testes foram editados, o relógio os executou novamente, mas eles falharam exatamente por esse motivo.
Corrigi-o verificando se o modelo existe, então use-o, caso contrário, crie-o.
fonte
module.export = User
paraexport defaults User
. Eu também tiverefs
que usar outros modelos. Não sei por que mudar demodule.exports
paraexport default
trouxe esse problema. No entanto, essa resposta parece ter corrigido.mongoose.models
não existe, pelo menos em versões recentesfor (let model in mongoose.models) delete mongoose.models[model]
"test": "NODE_ENV=test mocha --file mocha.config.js --watch"
e nesse arquivo js de configuração eu tenho umbefore()
eafter()
para lidar com a configuração e a desmontagem. @E.Sundin forneceu a solução perfeita aqui, e funciona perfeitamente. Obrigado!Tenho enfrentado esse problema e não era por causa das definições do esquema, mas sim do modo off-line sem servidor - acabei de resolver isso:
Que é mencionado aqui https://github.com/dherault/serverless-offline/issues/258
Espero que isso ajude alguém que está construindo seu projeto sem servidor e executando o modo offline.
fonte
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
Se você estiver usando Serverless offline e não quiser usar
--skipCacheInvalidation
, pode muito bem usar:fonte
--skipCacheInvalidation
Se você fez isso aqui é possível que você tenha o mesmo problema que eu. Meu problema era que eu estava definindo outro modelo com o mesmo nome . Chamei minha galeria e meu modelo de arquivo de "Arquivo". Droga, você copia e cola!
fonte
Isso aconteceu comigo quando eu escrevo assim:
No entanto, o verdadeiro caminho é '../myUser/User.js'
fonte
Eu resolvi isso adicionando
antes da linha:
Espero que isso resolva seu problema
fonte
mongoose.connection.models = {};
Para resolver isso verifique se o modelo existe antes de fazer a criação:
fonte
Sei que existe uma solução aceita, mas sinto que a solução atual resulta em muitos clichês apenas para que você possa testar os Modelos. Minha solução é essencialmente pegar seu modelo e colocá-lo dentro de uma função, resultando no retorno do novo modelo se o modelo não tiver sido registrado, mas retornando o modelo existente se ele foi.
Abrir e fechar conexões em todos os lugares é frustrante e não compacta bem.
Dessa forma, se eu solicitasse o modelo em dois locais diferentes ou mais especificamente em meus testes, não obteria erros e todas as informações corretas estão sendo retornadas.
fonte
Este problema pode ocorrer se você definir 2 esquemas diferentes com o mesmo nome de coleção
fonte
fonte
Eu tive o mesmo problema, o motivo foi definir esquema um modelo em uma função JS, eles devem ser definidos globalmente em um módulo de nó, não em uma função.
fonte
Existe outra maneira de lançar esse erro.
Lembre-se de que o caminho para o modelo diferencia maiúsculas de minúsculas.
Neste exemplo semelhante envolvendo o modelo "Categoria", o erro foi lançado sob estas condições:
1) O comando require foi citado em dois arquivos: ..category.js e ..index.js 2) No primeiro, o caso estava correto, no segundo arquivo não era o seguinte:
category.js
index.js
fonte
A definição do esquema deve ser exclusiva para uma coleção, não deve ser mais do que um esquema para uma coleção.
fonte
é porque seu esquema já existe, valide antes de criar um novo esquema.
fonte
Você pode resolver isso facilmente fazendo
fonte
Eu tenho uma situação em que tenho que criar o modelo dinamicamente com cada solicitação e por causa disso recebi este erro, no entanto, o que usei para corrigi-lo foi usando o método deleteModel como o seguinte:
Espero que isso possa ajudar alguém.
fonte
fonte
Para todas as pessoas que terminam aqui por causa de uma base de código com uma mistura de Typegoose e Mongoose :
Crie uma conexão db para cada um:
Mongoose:
Typegoose:
fonte
Acabei de ter um erro ao copiar e colar. Em uma linha eu tinha o mesmo nome que em outro modelo (modelo de anúncio):
O correto é:
A propósito, se alguém tiver "salvamento automático" e usar o índice para consultas como:
Ele tem que excluir o índice e reescrever para o modelo correto:
fonte
Eu resolvi esse problema fazendo isso
Em seguida, em outros arquivos
Melhor Solução
Eu espero que isso ajude...
fonte
Já que esse problema aconteceu porque chamando o modelo outra hora. Contorne esse problema envolvendo seu código de modelo no bloco try catch. o código datilografado é assim -
Da mesma forma, você também pode escrever código em js.
fonte
Você está usando mongoose.model com o mesmo nome de variável "usuário" em check.js e insert.js.
fonte
Se você estiver trabalhando com expressjs, pode ser necessário mover sua definição de modelo para fora de app.get () para que seja chamado apenas uma vez quando o script for instanciado.
fonte