2015-02-16 23 views
1

Я пытаюсь настроить для моей базы данных REST api, используя node js и express.REST routing multiple files node js

Теперь ive всегда был поклонником деления и покорения, и из-за этого я немного расстроен как избыточным кодом, так и массивным файлом сервера, который вы получите при создании REST api in node j.

Возьмем, к примеру CRUD операции на столе пользователя:

// IMPORT ROUTES 
// ============================================================================= 
var router = express.Router(); 

// on routes that end in /users 
// ---------------------------------------------------- 
router.route('/user') 

// create a user (accessed at POST http://localhost:8080/api/users) 
    .post(function (req, res) { 

     var username = req.body.username; //bodyParser does the magic 
     var password = req.body.password; 

     var user = User.build({username: username, password: password}); 

     user.add(function (success) { 
       res.json({message: 'User created!'}); 
      }, 
      function (err) { 
       res.status(err).send(err); 
      }); 
    }) 

// get all the users (accessed at GET http://localhost:8080/api/users) 
    .get(function (req, res) { 
     var user = User.build(); 

     user.retrieveAll(function (users) { 
      if (users) { 
       res.json(users); 
      } else { 
       res.status(401).send("User not found"); 
      } 
     }, function (error) { 
      res.status("User not found").send('user not found'); 
     }); 
    }); 


var User = sequelize.define('user', { 
     id: DataTypes.INTEGER, 
     username: DataTypes.STRING, 
     password: DataTypes.STRING, 
     name: DataTypes.STRING, 
     organization_id: DataTypes.INTEGER, 
     type_id: DataTypes.INTEGER, 
     join_date: DataTypes.STRING, 
     image_path: DataTypes.STRING, 
     status_id: DataTypes.INTEGER 

    }, { freezeTableName: true, 
      instanceMethods: { 
      retrieveAll: function (onSuccess, onError) { 
       User.findAll({}, {raw: true}) 
        .ok(onSuccess).error(onError); 
      }, 
      retrieveById: function (user_id, onSuccess, onError) { 
       User.find({where: {id: user_id}}, {raw: true}) 
        .success(onSuccess).error(onError); 
      }, 
      add: function (onSuccess, onError) { 
       var username = this.username; 
       var password = this.password; 

       var shasum = crypto.createHash('sha1'); 
       shasum.update(password); 
       password = shasum.digest('hex'); 

       User.build({username: username, password: password}) 
        .save().ok(onSuccess).error(onError); 
      }, 
      updateById: function (user_id, onSuccess, onError) { 
       var id = user_id; 
       var username = this.username; 
       var password = this.password; 

       var shasum = crypto.createHash('sha1'); 
       shasum.update(password); 
       password = shasum.digest('hex'); 

       User.update({username: username, password: password}, {where: {id: id}}) 
        .success(onSuccess).error(onError); 
      }, 
      removeById: function (user_id, onSuccess, onError) { 
       User.destroy({where: {id: user_id}}).success(onSuccess).error(onError); 
      } 
     } 
} 
); 

// on routes that end in /users/:user_id 
// ---------------------------------------------------- 
router.route('/users/:user_id') 

// update a user (accessed at PUT http://localhost:8080/api/users/:user_id) 
    .put(function (req, res) { 
     var user = User.build(); 

     user.username = req.body.username; 
     user.password = req.body.password; 

     user.updateById(req.params.user_id, function (success) { 
      console.log(success); 
      if (success) { 
       res.json({message: 'User updated!'}); 
      } else { 
       res.send(401, "User not found"); 
      } 
     }, function (error) { 
      res.send("User not found"); 
     }); 
    }) 

// get a user by id(accessed at GET http://localhost:8080/api/users/:user_id) 
    .get(function (req, res) { 
     var user = User.build(); 

     user.retrieveById(req.params.user_id, function (users) { 
      if (users) { 
       res.json(users); 
      } else { 
       res.status(401).send("User not found"); 
      } 
     }, function (error) { 
      res.send("User not found"); 
     }); 
    }) 

// delete a user by id (accessed at DELETE http://localhost:8080/api/users/:user_id) 
    .delete(function (req, res) { 
     var user = User.build(); 

     user.removeById(req.params.user_id, function (users) { 
      if (users) { 
       res.json({message: 'User removed!'}); 
      } else { 
       res.status(401).send("User not found"); 
      } 
     }, function (error) { 
      res.send("User not found"); 
     }); 
    }); 

Теперь это только для одной таблицы.

Итак, я думал, что должен быть лучший способ организовать все это?

Итак, мой вопрос в том, можете ли вы разделить каждый маршрут на отдельный файл и есть ли способ упростить маршрутизацию/сбор данных, чтобы удалить избыточность?

+0

Вы можете поместить код в несколько файлов и просто включить их в главный 'server.js' –

+0

@VsevolodGoloviznin можете ли вы разместить пример того, как вы можете это сделать? –

ответ

2

Это, как я это делаю:

//controllers/someController.js 
var express = require('express'); 
var router = express.Router(); 

router.post('/something', function(req, res, next) { 
    ... 
}); 
router.get('/something', function(req, res, next) { 
    ... 
}); 

module.exports = router; 

//server.js 
var app = require('express')(); 
var someController = require('./controllers/someContoller'); 
app.use('/some', someController); 

Поэтому в основном я создаю промежуточное программное обеспечение, который будет обрабатывать запрос на указанном пути. Вы даже можете упростить этот процесс путем перебора всех файлов контроллера, которые у вас есть и требуя от них, но мне нравится, что это как то :)

Update:

Вы можете передать зависимости право управления:

//someController.js 
module.exports = function(express) { 
    var router = express.Router(); 

    router.get('', function() {}); 

    return router; 
} 

//server.js 
var app = require('express')(); 
var someController = require('./controllers/someContoller')(express); 
app.use('/some', someController); 
+0

Вы бы назвали функции REST контроллером или моделью? –

+0

Em, модель - это в основном то, что мы передаем api и то, что мы храним, поэтому это контроллер, и вы будете использовать свои модели внутри него (в одном контроллере может использоваться несколько моделей) –

+0

с этим apporach я бы переделывать все переменные каждый раз, когда у меня появился новый файл? разве это не выглядит излишним? –