我已阅读本主题中的问题。但我无法找到解决方案,因为我认为我很好地定义了Schema。
我的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。
答案 0 :(得分:4)
由于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);
或强>
require('modelDirectory/model.js');//load model file first then use model from there
var Todo = mongoose.model('Todo');
或强>
为每个模型创建单独的文件。例如在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');
答案 1 :(得分: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;
希望这有帮助。
答案 2 :(得分:0)
您需要在app.js和
中要求该文件require('YOUR PATH')
从模型页面
导出文件var User=mongoose.model('User', userSchema);
module.exports = User
答案 3 :(得分:0)
Todo.js
文件:
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var todoSchema = new Schema({
title: String,
date: String,
completed: String,
});
module.exports = mongoose.model("todo",todoSchema);
这是我的模型文件 Todo.js。如果你不想得到这个错误,你应该在你的 api 文件中导入你的模型文件。
例如,我在路由文件下有一个 api 文件 todos.js
。
我确实在 routes/todos.js
中获取、发布、放置操作。
我在 todos.js
中导入了模型文件。
var express = require('express');
var router = express.Router();
var Todo = require("../models/Todo");
router.get('/', function(req, res, next) {
Todo.find().then((todos) => {
res.json(todos);
}).catch((err) => {
res.json(err);
});
});