2014-09-01 2 views
1

Я вроде как новый относительно API-интерфейсов node.js, express.js и REST.Express.js: вызов внутренних служб

Вот мой вопрос:

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

Какова наилучшая практика в этом случае?

1) Загрузка непосредственно из базы данных:

index.js:

db.collection('usercollection').findOne({email: req.user.email}, function(err, result){... 

2) Вызов службы из другого маршрута, который считывает из базы данных:

users.js:

/* GET user by email */ 
router.get('/:email', function(req, res) { 

    var db = req.db; 
    var email = req.params.email; 
    db.collection('usercollection').findOne({email: email}, function(err, result) { 
    if (err) throw err; 
    res.json(result); 
    }); 

}); 

index.js:

// Позвонить пользователям/email/emailParameterURL

3) Ни один из этих двух?

Спасибо за ваше время

ответ

3

Лично я стараюсь, чтобы моя логика приложения была отделена от маршрутов Express, насколько это возможно.

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

В маршрутах я использую эти классы контроллеров, передавая им базу данных.

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

Он также позволяет вам легко менять маршруты, не нарушая приложению.

Кроме того, я не могу рекомендовать Bluebird promises достаточно. Это позволяет мне значительно упрощать вещи и избегать большого количества аддонов обратного вызова.

Крошечный пример:

/// usercontroller.js 
var UserController = { 
    _database: null, 
    setDatabase: function(db) { this._database = db; }, 

    findUserByEmail: function(email, callback) { 
     this._database.collection('usercollection').findOne({email: req.user.email}, callback); 
    } 
}; 

module.exports = UserController; 

/// routes.js 

/* GET user by email */ 
router.get('/:email', function(req, res) { 
    var UserController = require('./usercontroller'); 
    var db = req.db; 
    UserController.setDB(db); 
    UserController.findUserByEmail(req.params.email, function(err, result) { 
     if (err) throw err; 
     res.json(result); 
    }); 
}); 
+0

Благодарим Вас за ясный ответ. Я также думаю, что приложение будет намного чище. Я обязательно попробую Bluebird. – Komo

+0

Добро пожаловать. PS: Я просто исправил небольшую опечатку в коде, но базовая концепция такая же. –

0

позволяет сказать, если хотите, авторизованный доступ к API, вы не можете ничего сделать в первом случае. Если у вас нет защищенного расширенного доступа, первый случай может работать, но если вы хотите больше контролировать свой api, используйте второй. Под контролем я имею в виду манипулирование данными, возможно, у вас есть некоторые хешированные значения и т. Д.

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