【问题标题】:MongoDB referenceError: Schema is not definedMongoDB 参考错误:未定义架构
【发布时间】:2021-06-12 23:28:06
【问题描述】:

我已阅读此主题中的问题。但我没能找到解决方案,因为我认为我很好地定义了 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 没有任何错误。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    因为todoSchema 没有在app.js 中定义,所以不用like: mongoose.model('modelName')

    所以在你的 api.js 中使用 like

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

    【讨论】:

    • 在这种情况下,错误消息是“MissingSchemaError: Schema has not been registered for model "Todo". Use mongoose.model(name, schema)”。
    • 先加载模型文件。查看答案或部分@R.Andris
    • 这应该可以解决它,但它没有找到它。错误:找不到模块 ./models/models.js。我不明白,那个文件夹中确实存在。
    • 你的目录层次结构如何? -api.js -models/model.js 然后应该像require('./models/models');
    • api.js 在路由文件夹中。 models.js 位于模型文件夹中。 Bot 文件夹位于某个主文件夹中
    【解决方案2】:

    您缺少几行代码。

    先在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;

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您需要在 app.js 和

      中要求该文件
      require('YOUR PATH')
      

      从模型页面导出文件

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

      【讨论】:

        【解决方案4】:

        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 文件中导入你的模型文件。 例如,我在 routes 文件下有一个 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);
            });
          
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-24
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多