2016-05-08 2 views
0

У меня есть простое тестовое приложение NodeJS с экспресс, mongodb и mongoose. На данный момент я пытаюсь немного очистить свой код и найти лучшие методы. Одним из моих шагов является извлечение маршрутов REST, но у меня есть проблема в этом, и я смущен количеством способов сделать это, что лучший способ сделать это в 2016 году?Экспортировать узлы пути REST (с помощью экспресс)

Мой код (app.js):

"use strict" 
const express = require('express'); 
const bodyParser = require('body-parser'); 
const mongoose = require('mongoose'); 

const Subjects = require('./models/Subjects').model('Subjects'); 
const Students = require('./models/Students').model('Students'); 

const app = express(); 

app.use(express.static(__dirname + '/public')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 
mongoose.connect('mongodb://localhost/schoolapp'); 

app.get('/subjects', function(req, res) { 
    Subjects.find({}) 
     .exec(function(err, subjects) { 
      if(err) { 
       res.send('error msg has occured'); 
      } else { 
       res.json(subjects); 
      } 
     }) 
}); 

app.put('/subjects', function(req, res) { 
    const query = {name: req.body.name}; 
    const update = {$inc: {votes: 1}}; 

    Subjects.findOneAndUpdate(query, update, 
     function(err, newSubject) { 
      if(err) { 
       console.log('An error occured'); 
      } else { 
       res.send(newSubject); 
      } 
     }) 
}) 

app.post('/subjects', function(req, res) { 
    let newSubject = new Subjects(); 

    newSubject.name = req.body.name; 
    newSubject.level = req.body.level; 
    newSubject.votes = 0; 

    newSubject.save(function(err, subject) { 
     if(err) { 
      res.send('error saving subject'); 
     } else { 
      res.send(subject); 
     } 
    }) 
}); 

app.get('/students', function(req, res) { 
    Students.find({}) 
     .exec(function(err, students) { 
      if(err) { 
       res.send('error saving students'); 
      } else { 
       res.send(students); 
      } 
     }) 
}) 

app.post('/students', function(req, res) { 
    let newStudent = new Students(); 

    newStudent.name = req.body.name; 

    newStudent.save(function(err, student) { 
     if(err) { 
      res.send('error saving student'); 
     } else { 
      res.send(student); 
     } 
    }) 
}) 

app.put('/students', function(req, res) { 
    const query = {"_id": req.body.id}; 
    const update = {$push: {subjects: req.body.name}}; 

    Students.findOneAndUpdate(query, update, 
     function(err, newSubject) { 
      if(err) { 
       res.send('something went wrong'); 
      } else { 
       res.send(newSubject); 
      } 
     }); 
}) 

app.listen(3000, function() { 
    console.log('app listening on port 3000'); 
}); 

Я хочу, чтобы извлечь /students и /subjects в виде отдельных файлов и требовать от них в моем app.js.


Я попытался около 3 методов с различными результатами, в том числе:

module.exports = function(app) { 
    app.get('/students', ...) 
} 

и в app.js:

var students = require(./rest/students)(app); 

Большое спасибо :)

+2

http://expressjs.com/en/api.html#router –

+0

Да, @ тк-cbon прав: это является идеальным примером использования нескольких маршрутизаторов. – robertklep

+0

Я не собираюсь обслуживать html-шаблоны, я просто хочу использовать узел в качестве априори для отдыха, это все-таки прекрасный случай для нескольких маршрутизаторов? – Baki

ответ

0

Я отсортировал его благодаря mh-cbon. Я просто хотел опубликовать свое решение здесь, если кто-то еще будет искать вопрос.

app.js

'use strict'; 
const express = require('express'); 
const bodyParser = require('body-parser'); 
const mongoose = require('mongoose'); 

const app = express(); 

app.use(express.static(__dirname + '/public')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 

app.use('/subjects', require('./rest/subjects')); 
app.use('/students', require('./rest/students')); 

mongoose.connect('mongodb://localhost/schoolapp'); 

app.listen(3000, function() { 
    console.log('app listening on port 3000'); 
}); 

students.js

'use strict'; 
const Students = require('../models/Students').model('Students'); 
const express = require('express'); 
let router  = express.Router(); 

router.get('/', function(req, res) { 
    Students.find({}) 
     .exec(function(err, students) { 
      if(err) { 
       res.send('error saving students'); 
      } else { 
       res.send(students); 
      } 
     }) 
}) 

router.post('/', function(req, res) { 
    let newStudent = new Students(); 

    newStudent.name = req.body.name; 

    newStudent.save(function(err, student) { 
     if(err) { 
      res.send('error saving student'); 
     } else { 
      res.send(student); 
     } 
    }) 
}) 

router.put('/', function(req, res) { 
    const query = {"_id": req.body.id}; 
    const update = {$push: {subjects: req.body.name}}; 

    Students.findOneAndUpdate(query, update, 
     function(err, newSubject) { 
      if(err) { 
       res.send('something went wrong'); 
      } else { 
       res.send(newSubject); 
      } 
     }); 
}) 

module.exports = router; 

Примечание: указав путь в app.js через ./rest/subjects сделает ваши пути в модулях укоренить '/' (см students.js), в отличие от некоторых уроков.

Я также нашел эту статью полезной (так как это показывает простой пример): https://www.terlici.com/2014/09/29/express-router.html

Смежные вопросы