2017-01-31 30 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