如何重用数据库控制器

时间:2017-01-18 14:49:46

标签: node.js mongodb express

我正在尝试重用处理数据库操作的控制器。我在构建应用程序时有点挣扎。这就是我所拥有的:

server.js

var apiController = require('./controllers/api');

router.get('/cars', function (req, res) {
    // get all cars from DB and render view

    apiController.getCars().then(function (cars) {
        res.render('index', {cars: cars});
    });
});

router.get('/api/cars', function (req, res) {
    // get all cars from DB and return JSON

    apiController.getCars().then(function (cars) {
        res.json(cars);
    });
});

控制器/ api.js

module.exports = {

    getCars: function () {
        db.collection('cars').find().toArray( function (err, cars) {
            if (err) throw err;
            return cars;
        });
    },

    // tried also something like this but this doesn't really work 
    // for my use case because I don't want to attach any particular
    // res to the function
    getCars: function (req, res, next) {
        db.collection('cars').find().toArray( function (err, cars) {
            if (err) throw err;
            res.json(cars);
        });
    },
};

3 个答案:

答案 0 :(得分:0)

您当前的问题是,当您在控制器中使用回调时,您希望promises作为server.js中的返回值。我建议你改变你的函数getCars来返回一个Promise。不知道你正在使用什么ODM / ORM,但它可能看起来像这样:

getCars: function () {
    return db.collection('cars').find();
},

答案 1 :(得分:0)

server.js

var apiController = require('./controllers/api');
    router.get('/cars', apiController.getCars);



controllers/api.js

    function getCarsAsync(req, res, next){
         db.collection('cars').find().then(function(carsData){
            if(carsData){
               return res.send(carsData);
            }
            else{
                return res.status(401).send('User is not authorized');
            }
         }).catch(function(err){
            return next(err);
         });
    }

    module.exports = { 
        getCars: getCarsAsync
   };

答案 2 :(得分:0)

server.js

var apiController = require('./controllers/api');
router.get('/cars', function (req, res) {
    apiController.get('cars').then(function (cars) {
        res.render('index', {cars: cars});
    });
});

router.get('/api/cars', function (req, res) {
    apiController.get('cars').then(function (cars) {
        res.json(cars);
    });
});

控制器/ api.js

var Promise = require('bluebird');
module.exports = {
  get: function (modelName) {
    return new Promise(function(resolve,reject){
      return db.collection(modelName).find().toArray(function(err, models){
        if (err) {
          return reject(err);
        }
        else {
          return resolve(models);
        }
      });
    });
  }
};