2014-11-08 111 views
41

我學習的平均堆,當我嘗試使用來啓動服務器貓鼬架構尚未註冊模式

npm start 

我得到一個異常說:

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

這裏是我的代碼裏面/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); 

,我可以看到的架構應註冊爲模型「郵政」,但什麼C可能導致異常被拋出?

在此先感謝。

編輯:這裏的異常錯誤

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

和這裏的app.js代碼與貓鼬初始化:

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

前行:

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

你犯了一個錯誤在其他地方。上面的代碼是有效的。也許你在某處「需要」(Post)「Post.js」,但是你從未「導出」模型。 – 2014-11-08 14:29:13

+0

@NeilLunn好的,我將編輯與我的異常錯誤的問題,因爲這是我可以從它讀取的。也許其他人可以看到我看不到 – 2014-11-08 14:30:40

+0

@Umm。你以後「需要」你有沒有「出口」?我認爲這是在這裏失蹤的代碼。 – 2014-11-08 14:33:38

回答

87

這是不是模型導出的問題。我遇到過同樣的問題。

真正的問題是,需要爲模特

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

均低於路徑依賴聲明。只需將mongoDB依賴關係移動到路由依賴關係上方即可。這是它應該是什麼樣子:

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

謝謝!看起來我們都在使用Thinkster教程。 – maiamachine 2015-11-29 21:29:54

+0

謝謝。這讓我煩惱了好幾個小時。 – Surya 2015-12-03 18:18:49

+0

它不適合我。顯示相同的錯誤 – Sky 2016-02-02 15:19:28

5

如果有人coudn't正確答案(比如我)的方法解決這個問題,嘗試一下在創建架構。我把'ref'寫成'User',但正確的是'user'。

錯誤:

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

正確:

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

在闡述上述拉斐爾格里利的回答,

正確:

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

如果使用多個MongoDB的CONNECTIONS


提防使用.populate()時,你必須提供模型貓鼬不僅將在同一連接上「發現」的車型。 即其中:

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

正確:

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

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

錯誤(生產 「架構尚未註冊模型」 的錯誤):

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

您還應該檢查數據庫中沒有髒數據。我結束了一個包含參考模型的小寫版本的文檔(user而不是User)。這會導致錯誤,難以追查。

容易解決了快速蒙戈查詢:

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