2017-01-31 60 views
0

我已閱讀本主題中的問題。但是我無法找到解決方案,因爲我認爲我很好地定義了Schema。MongoDB referenceError:架構未定義

我models.js是這樣的。

var mongoose = require('mongoose'); 


var userSchema = new mongoose.Schema({ 
username: String, 
password: String, 
created_at: { type: Date, default: Date.now } 
}); 

var todoSchema = new mongoose.Schema({ 
title: String, 
done: Boolean, 
priority: String, 
deadLine: String, 
masterDetailNote: String 
}); 

mongoose.model('User', userSchema); 
mongoose.model('Todo', todoSchema); 

我的api.js是這樣的。

var express = require('express'); 
var router = express.Router(); 
var mongoose = require('mongoose'); 
var Todo = mongoose.model('Todo', todoSchema); 

router.use(function(req, res, next) { 

if (req.method === "GET") { 
    return next(); 
} 

if (!req.isAuthenticated()) { 
    return res.redirect('#/login'); 
} 
return next(); 
}); 
router.route('/posts') 

//returns all todos 
.get(function(req, res) { 

Todo.find(function(err, data) { 

    if (err) { 
     return res.send(500, err); 
    } 

    return res.send(data); 

}); 

}) 

//creates a new todo 
.post(function(req, res) { 

var todo = new Todo(); 
todo.title = req.body.title; 
todo.done = req.body.done; 
todo.priority = req.body.priority; 
todo.deadLine = req.body.deadLine; 
todo.masterDetailNote = req.body.masterDetailNote; 

todo.save(function(err, post) { 
    if (err) { 
     return res.send(500, err); 
    } 
    return res.json(todo); 
    }); 
}); 

router.route('/posts/:id') 

//egy bizonyos Todo-t hoz vissza 
.get(function(req, res) { 
Todo.findById(req.params.id, function(err, post) { 
    if (err) 
     res.send(err); 
    res.json(post); 
}); 
}) 

//frissít egy todot 
.put(function(req, res) { 
Todo.findById(req.params.id, function(err, post) { 
    if (err) 
     res.send(err); 

    todo.title = req.body.title; 
    todo.done = req.body.done; 
    todo.priority = req.body.priority; 
    todo.deadLine = req.body.deadLine; 
    todo.masterDetailNote = req.body.masterDetailNote; 

    todo.save(function(err, post) { 
     if (err) 
      res.send(err); 

     res.json(post); 
    }); 
    }); 
}) 

.delete(function(req, res) { 
Todo.remove({ 
    _id: req.params.id 
}, function(err) { 
    if (err) 
     res.send(err); 
    res.json("deleted :("); 
}); 
}); 

module.exports = router; 

當我嘗試啓動服務器時,它顯示錯誤消息。

var Todo = mongoose.model('Todo', todoSchema); 

RefferenceError:todoSchema未定義。我不太明白,因爲它的定義與userSchema完全相同。但是我可以使用userSyhema而沒有任何錯誤。

回答

3

由於todoSchema的不app.js使用定義不一樣:mongoose.model('modelName')

所以你api.js使用像

var Todo = mongoose.model('Todo');// ensure first model file is loaded 

,而不是

var Todo = mongoose.model('Todo', todoSchema); 

OR

require('modelDirectory/model.js');//load model file first then use model from there 
var Todo = mongoose.model('Todo'); 

OR

創建的每個模型的單獨文件。例如在todo.js

var mongoose = require('mongoose'); 

var todoSchema = new mongoose.Schema({ 
title: String, 
done: Boolean, 
priority: String, 
deadLine: String, 
masterDetailNote: String 
}); 

module.exports = mongoose.model('Todo', todoSchema); 

api.js

var Todo = require('modelDirectory/todo.js'); 
+0

在這種情況下,文件,錯誤消息是「MissingSchemaError:架構尚未註冊模式‘待辦事項’使用mongoose.model(名稱。 ,架構)「。 –

+0

首先加載模型文件。看到答案或部分@ R.Andris –

+0

這應該解決它,但它沒有找到它。錯誤:找不到模塊./models/models.js。我不明白,那個文件夾確實存在。 –

0

你丟失的幾行代碼。

首先在models.js

var User = mongoose.model('User', userSchema);

var Todo = mongoose.model('Todo', todoSchema);

module.exports = {User: User, Todo: Todo}

然後在api.js

var models = require('./models.js')

var Todo = models.Todo;

希望這有助於。

0

你需要需要的應用程序,文件。js和

require('YOUR PATH') 

出口從模型頁面

var User=mongoose.model('User', userSchema); 
    module.exports = User