javascript - MongoDB referenceError: Schema is not defined - Stack Overflow

I've read the questions in this topic. But I wasn't able to find the solution, because I thin

I've read the questions in this topic. But I wasn't able to find the solution, because I think I defined the Schema well.

My models.js is like this.

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

My api.js is like this.

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;

When i try to strat the server it shows the error message.

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

RefferenceError: todoSchema is not defined. I don't really understand because it is defined exactly like the userSchema. But I can use the userSyhema without any error.

I've read the questions in this topic. But I wasn't able to find the solution, because I think I defined the Schema well.

My models.js is like this.

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

My api.js is like this.

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;

When i try to strat the server it shows the error message.

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

RefferenceError: todoSchema is not defined. I don't really understand because it is defined exactly like the userSchema. But I can use the userSyhema without any error.

Share Improve this question edited Jan 31, 2017 at 11:55 ares 4,4136 gold badges37 silver badges64 bronze badges asked Jan 31, 2017 at 11:39 UmskiptingurUmskiptingur 1251 silver badge10 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 4

Because of todoSchema is not defined in app.js use without like: mongoose.model('modelName')

so in your api.js use like

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

instead of

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

create separate file for each model. for example in 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);

and in api.js

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

You missing few lines of code.

First in models.js add

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

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

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

Then in api.js

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

var Todo = models.Todo;

Hope this helps.

You need to require that file in app.js and

require('YOUR PATH')

export the file from model page

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

Todo.js file:

var mongoose = require("mongoose");

var Schema = mongoose.Schema;

var todoSchema = new Schema({
    title: String,
    date: String,
    pleted: String,
});

module.exports = mongoose.model("todo",todoSchema);

This is my models file Todo.js. İf you wanna don't get this error, you should import your model file in your api file. For example I have a api file todos.js under routes file. I do get, post, put operation in routes/todos.js. I imported models file in the 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);
    });
  
});

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745311488a4622019.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信