2014-11-08 14 views
41

sto imparando la pila media e quando provo ad avviare il server utilizzandoMongoose schema non è stato registrato per il modello

npm start 

ottengo un'eccezione dicendo che:

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

qui è il mio codice all'interno /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); 

come posso vedere lo schema deve essere registrato per il modello 'post', ma cosa c è possibile che venga generata l'eccezione?

Grazie in anticipo.

Edit: Ecco l'errore di eccezione

/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) 

ed ecco il codice app.js con l'inizializzazione mangusta:

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

prima della riga:

app.use('/', routes); 
+0

Stai commettendo un errore da qualche altra parte. Il codice sopra è valido. Forse stai "require" (ing) 'Post.js' da qualche parte, ma non hai mai" esportato "il modello. –

+0

@NeilLunn ok modifico la domanda con il mio errore di eccezione, perché è tutto ciò che posso leggere da esso. forse altri possono vedere ciò che non posso vedere –

+0

@ Umm. Hai mai "esportato" dove "richiesto" più tardi? Penso che questo sia il codice che manca qui. –

risposta

87

E ' non è un problema con l'esportazione del modello. Ho avuto lo stesso problema.

Il vero problema è che richiedono dichiarazioni a modelli

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

erano sotto rotte dipendenze. Sposta semplicemente le dipendenze mongoDB sopra le dipendenze delle rotte. Questo è quello che dovrebbe essere simile:

// 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(); 
+9

Grazie! Sembra che stiamo tutti utilizzando il tutorial di Thinkster. – maiamachine

+0

Grazie. questo mi dava fastidio per ore. – Surya

+0

Non funziona per me. Visualizzazione dello stesso errore – Sky

5

Se qualcuno coudn't risolvere il problema con l'approccio della risposta corretta (come me), prova a guardare alla creazione dello schema. Ho scritto il 'ref' come 'utente', ma il corretto era 'utente'.

Sbagliato:

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

corretta:

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

Elaborando la risposta di Rafael Grilli sopra,

corretta:

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'); 
2

L'UTILIZZO DI COLLEGAMENTI MongoDB MULTIPLE


attenzione che quando si usa .populate() è necessario fornire il modello come mangusta servirà solo a "trovare" modelli sulla stessa connessione. cioè dove:

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); 

corretto:

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

o

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

errato (produce "lo schema non è stato registrato per il modello" errore):

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

Si dovrebbe anche verificare di non avere dati sporchi nel proprio database. Ho finito con un documento contenente la versione in minuscolo del modello di riferimento (user anziché User). Questo causa l'errore ed è incredibilmente difficile da rintracciare.

facile da risolvere con una query mongo rapida:

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