MongoDB referenceError:未定义架构

时间:2017-01-31 11:39:50

标签: javascript node.js mongodb mongoose

我已阅读本主题中的问题。但我无法找到解决方案,因为我认为我很好地定义了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。

4 个答案:

答案 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);
    });
  
});