O esquema do mangusto não foi registrado para o modelo

Estou aprendendo a pilha média e quando tento iniciar o servidor usando

npm start 

Eu recebo uma exceção dizendo que:

 schema hasn't been registered for model 'Post'. Use mongoose.model(name, schema) 

aqui está meu código dentro de /models/Posts.js

 var mongoose = require('mongoose'); var PostSchema = new mongoose.Schema({ title: String, link: String, upvotes: { type: Number, default: 0 }, comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }] }); mongoose.model('Post', PostSchema); 

Como posso ver, o esquema deve ser registrado para o modelo ‘Post’, mas o que pode estar causando a exceção?

Desde já, obrigado.

Edit: Aqui está o erro de exceção

 /home/arash/Documents/projects/personal/flapper-news/node_modules/mongoose/lib/index.js:323 throw new mongoose.Error.MissingSchemaError(name); ^ MissingSchemaError: Schema hasn't been registered for model "Post". Use mongoose.model(name, schema) 

e aqui está o código app.js com a boot do mangusto:

 var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/news'); require('./models/Posts'); require('./models/Comments'); 

antes da linha:

 app.use('/', routes); 

Não é um problema com a exportação de modelos. Eu tive o mesmo problema.

A questão real é que exigem declarações para os modelos

 var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/news'); require('./models/Posts'); require('./models/Comments'); 

estavam abaixo das dependencies das rotas. Simplesmente mova as dependencies do mongoDB acima das dependencies das rotas. É assim que deve ser:

 // MongoDB var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/news'); require('./models/Posts'); require('./models/Comments'); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express(); 

Se alguém não puder corrigi-lo com a abordagem da resposta correta (como eu), tente ver a criação do esquema. Eu escrevi o ‘ref’ como ‘User’, mas o correto era ‘user’.

Errado:

 createdBy: { type: Schema.Types.ObjectId, ref: 'User' } 

Corrigir:

 createdBy: { type: Schema.Types.ObjectId, ref: 'user' } 

SE VOCÊ USA CONEXÕES MÚNGICAS MÚLTIPLAS


cuidado ao usar o .populate () você DEVE fornecer o modelo como o mangusto só “encontrará” modelos na mesma conexão. ou seja, onde:

 var db1 = mongoose.createConnection('mongodb://localhost:27017/gh3639'); var db2 = mongoose.createConnection('mongodb://localhost:27017/gh3639_2'); var userSchema = mongoose.Schema({ "name": String, "email": String }); var customerSchema = mongoose.Schema({ "name" : { type: String }, "email" : [ String ], "created_by" : { type: mongoose.Schema.Types.ObjectId, ref: 'users' }, }); var User = db1.model('users', userSchema); var Customer = db2.model('customers', customerSchema); 

Corrigir:

 Customer.findOne({}).populate('created_by', 'name email', User) 

ou

 Customer.findOne({}).populate({ path: 'created_by', model: User }) 

Erro incorreto (produz “o esquema não foi registrado para o modelo”):

 Customer.findOne({}).populate('created_by'); 

Elaborando a resposta de Rafael Grilli acima,

Corrigir:

 var HouseSchema = new mongoose.Schema({ date: {type: Date, default:Date.now}, floorplan: String, name:String, house_id:String, addressLine1:String, addressLine2:String, city:String, postCode:String, _locks:[{type: Schema.Types.ObjectId, ref: 'xxx'}] //ref here refers to the first parameter passed into mongoose.model() }); var House = mongoose.model('xxx', HouseSchema, 'houseschemas'); 

Você também deve verificar se não possui dados sujos em seu database. Acabei com um documento contendo a versão em minúsculas do modelo referenciado ( user vez de User ). Isso causa o erro e é incrivelmente difícil rastrear.

Fácil de corrigir com uma consulta rápida do mongo:

 db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })