2017-07-09 15 views
1

我是新的MEANJS:我正在用meanJS技術構建一個todolist。我從服務器端開始。當我運行我的server.js文件我得到了以下錯誤:MeanJS:MissingSchemaError當runnig服務器

node_modules\mongoose\lib\index.js:395 
     throw new mongoose.Error.MissingSchemaError(name); 
    ^
MissingSchemaError: Schema hasn't been registered for model "Todo". 
Use mongoose.model(name, schema) 
    at Mongoose.model (D:\meanjs\todolist\node_modules\mongoose\lib\index.js:395:13) 
    at Object.<anonymous> (D:\meanjs\todolist\server\api\todo.js:5:23) 
    at Module._compile (module.js:409:26) 
    at Object.Module._extensions..js (module.js:416:10) 
    at Module.load (module.js:343:32) 
    at Function.Module._load (module.js:300:12) 
    at Module.require (module.js:353:17) 
    at require (internal/module.js:12:17) 
    at Object.<anonymous> (D:\meanjs\todolist\server\api\index.js:3:21) 
    at Module._compile (module.js:409:26) 
    at Object.Module._extensions..js (module.js:416:10) 
    at Module.load (module.js:343:32) 
    at Function.Module._load (module.js:300:12) 
    at Module.require (module.js:353:17) 
    at require (internal/module.js:12:17) 

這裏是我的server.js文件:

//Import dependencies 
const express = require('express'); 
const path = require('path'); 
const http = require('http'); 
const bodyParser = require('body-parser'); 
const mongoose = require('mongoose'); 


//Connect to mongoDB server 
mongoose.connect('mongodb://localhost/todoApp'); 
mongoose.set('debug', true); 

//Get our API routes 
const api = require('./server/api/'); 
//Require the models 
require('./server/models/task.model'); //HERE 
require('./server/models/todo.model'); //HERE 

//Init express 
const app = express(); 

//Set API routes 
app.use('/api', api); 

//Enable bodyParser 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended:false})); 

//Enable CORS 
app.use(function(req, res, next) { 
res.header("Access-Control-Allow-Origin", "*"); 
res.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"); 
next(); 
}); 

//Get environment port or use 3000 
const port = process.env.PORT || '3000'; 
app.set('port', port); 

//Create HTTP server. 
const server = http.createServer(app); 

//Listen on port 
server.listen(port,() => console.log(`API running on localhost:${port}`)); 

我在服務器/ API項目目錄threefiles。 index.js

var router = require('express').Router(); 

router.use('/todo', require('./todo')); 
router.use('/todo/task', require('./task')); 

module.exports = router; 

task.js

"use strict"; 
const router = require('express').Router(); 
const mongoose = require('mongoose'); 

const Todo = mongoose.model('Todo'); 
const Task = mongoose.model('Task'); 

router.param('task', function (req, res, next, id) { 
    if (!id.match(/^[0-9a-fA-F]{24}$/)) { 
     return res.sendStatus(422); 
    } 
    Task.findById(id).then((task) => { 
     if (!task) { return res.sendStatus(404); } 
     req.task = task; 
     return next(); 
    }) 
}); 

router.post('/', (req, res) => { 
    if (!req.body.todoId || !req.body.content) { 
     res.sendStatus(422); 
    } 

    if (!req.body.todoId.match(/^[0-9a-fA-F]{24}$/)) { 
     res.sendStatus(422); 
    } 

    Todo.findById(req.body.todoId).then((todo) => { 
     if (!todo) { res.statusCode(404); } 

     let task = new Task(); 
     task.content = req.body.content; 
     task.state = false; 
     task.todo = todo; 

     task.save().then(() => { 
      todo.tasks.push(task); 
      todo.save().then(() => { 
       res.json(task.toDto()).statusCode(201); 
      }); 
     }); 
    }); 
}); 

router.put('/', (req, res) => { 

    if (req.body.state == undefined || !req.body.id) { 
     res.sendStatus(422); 
    } 

    if (!req.body.id.match(/^[0-9a-fA-F]{24}$/)) { 
     res.sendStatus(422); 
    } 


    Task.findById(req.body.id).then((task) => { 
     task.state = req.body.state; 
     task.save().then(() => { 
      res.json(task.toDto()).statusCode(200); 
     }) 
    }) 
}); 

router.delete('/:task', (req, res) => { 
    let task = req.task; 
    task.remove().then(() => { 
     res.sendStatus(200); 
    }); 
}); 

todo.js

"use strict"; 
const router = require('express').Router(); 
const mongoose = require('mongoose'); 

const Todo = mongoose.model('Todo'); 
const Task = mongoose.model('Task'); 

router.param('todo', function (req, res, next, id) { 

    if (!id.match(/^[0-9a-fA-F]{24}$/)) { 
     return res.sendStatus(422); 
    } 

    Todo.findById(id) 
     .populate('tasks') 
     .then(function (todo) { 
      if (!todo) { return res.sendStatus(404); } 

      req.todo = todo; 

      return next(); 
     }); 
}); 

router.get('/', (req, res) => { 

    Todo.find() 
     .populate('tasks') 
     .then((todos) => { 
      if (!todos) { return res.sendStatus(404); } 

      return res.json({ 
       todos: todos.map((todo) => { 
        return todo.toDto(); 
       }) 
      }).statusCode(200); 
     }); 
}); 


router.post('/', (req, res) => { 
    if (!req.body.title) { 
     res.sendStatus(422); 
    } 

    let todo = new Todo(); 
    todo.title = req.body.title; 

    todo.save().then(() => { 
     res.json(todo.toDto()).statusCode(201); 
    }) 

}); 

router.delete('/:todo', (req, res) => { 

    req.todo.remove().then(function() { 
     return res.sendStatus(200); 
    }); 
}); 

我在服務器/型號兩種文件定義每個模型。 todo.model.js

const mongoose = require('mongoose'); 
const Task = mongoose.model('Task','TaskSchema'); 

let TodoSchema = new mongoose.Schema({ 
    title: { type: String, required: [true, "can't be blank"], index: true }, 
    tasks: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Task' }] 
}, { timestamps: true }); 

TodoSchema.pre('remove', (next) => { 
    Task.remove({ todoId: this._id }).exec(); 
    next(); 
}) 

TodoSchema.methods.toDto = function() { 

    return { 
     id: this._id, 
     title: this.title, 
     tasks: this.tasks.map((task) => { 
      return task.toDto(); 
     }) 
    } 

} 

mongoose.model('Todo', TodoSchema); 

task.model.js

const mongoose = require('mongoose'); 

let TaskSchema = new mongoose.Schema({ 
    content: { type: String, maxlength: 200 }, 
    state: { type: Boolean, default: false }, 
    todo: { type: mongoose.Schema.Types.ObjectId, ref: 'Todo' } 
}, { timestamps: true }); 


TaskSchema.methods.toDto = function() { 
    return { 
     id: this._id, 
     content: this.content, 
     state: this.state 
    } 
}; 

mongoose.model('Task', TaskSchema); 

如果我錯了嗎?

回答

1

在server.js

//Get our API routes 
const api = require('./server/api/'); 
//Require the models 
require('./server/models/task.model'); //HERE 
require('./server/models/todo.model'); //HERE 

變化

//Require the models 
require('./server/models/task.model'); //HERE 
require('./server/models/todo.model'); //HERE 
//Get our API routes 
const api = require('./server/api/'); 
+0

這正確了我的錯誤。但我有另一個錯誤。 – Pracede

+0

將此標記爲已解決,然後再打開另一個問題。你不能在這裏鏈接另一個問題。 (問題應立即解決以備將來參考) – taha

0

在您的架構文件(task.model.js & & todo.model.js)中,您沒有導出模型。在這兩個文件中,您需要添加以下內容:

// models/todo.model.js 
module.exports = mongoose.model('Todo', TodoSchema); 

// models/task.model.js 
module.exports = mongoose.model('Task', TaskSchema); 

取出多餘的,需要在您的server.js:

require('./server/models/task.model'); // GET RID OF THIS 
require('./server/models/todo.model'); // GET RID OF THIS 
在todo.js和task.js

而且,由於你現在出口該模型,您必須導入模型如下:

const Todo = require('../models/task.model') 
const Task = require('../models/todo.model') 

注意:這是假設我有你的目錄結構正確。

-server 
    -api 
    -models 
+0

我出口測試,但不能正常工作秩序。謝謝 – Pracede

+0

使用js擴展名導入不起作用 – Pracede

+0

現在的情況如何?你是否得到一個新的/不同的錯誤? –