2013-08-25 2 views
0

Мой API имеет три конечных точки: articles, websites и users. Каждый article связан с website. A user также могут делиться articles.Разработка и повторное использование кода узла Node

В моем API я только что создал конечную точку на /website/:id/articles. Это запросит базу данных для articles, связанной с данным website. Затем он выполняет некоторые манипуляции с данными для каждой статьи на основе того, кто говорит с API (например, пользователь делил эту статью?).

Теперь я перехожу к созданию аналогичной конечной точки в /users/:id/shared-articles. Запрос базы данных для этого несколько отличается: , но манипуляция, которую я хочу выполнить для данных статей, следующих за запросом, такая же, как и до.

Вот некоторые псевдо-код для бывшей конечной точки:

router.get('/websites/:id/articles', function (req, res) { 
    articleService.find({ websiteId: req.params.id }, function (error, foundArticles) { 

    async.waterfall([ 
     function (cb) { 
     // Manipulate foundArticles… 
     cb(null, manipulatedArticles) 
     }, 
     function (articles, cb) { 
     // Manipulate articles some more… 
     cb(null, manipulatedArticles) 
     }, 
    ], function (error, articles) { 
     if (error) { 
     return res.json(error, 400) 
     } 

     res.json(articles) 
    }) 
    }) 
}) 

Чтобы создать свою новую конечную точку, /users/:id/shared-articles, я мог абстрагировать манипуляции задачи в функции, которые могут быть совместно обоими из моих конечных точек (водопад выше), уменьшая повторение кода.

router.get('/websites/:id/articles', function (req, res) { 
    articleService.find({ websiteId: req.params.id }, function (error, foundArticles) { 
    manipulateArticles(foundArticles, function (articles) { 
     if (error) { 
     return res.json(error, 400) 
     } 

     res.json(articles) 
    }) 
    }) 
}) 

router.get('/users/:id/shared-articles', function (req, res) { 
    shareActionService.find({ userId: req.params.id }, function (error, foundShareActions) { 
    var sharedArticleIds = { _id: { $in: _.pluck(foundShareActions, 'sharedArticleId') } } 

    articleService.find(sharedArticleIds, function (error, foundArticles) { 
     manipulateArticles(foundArticles, function (articles) { 
     if (error) { 
      return res.json(error, 400) 
     } 

     res.json(articles) 
     }) 
    }) 
    }) 
}) 

Однако я понял, что это своего рода код повторного использования задачи должны быть общими при проектировании интерфейсов API в Node, и я хотел бы знать, если есть, очевидно, лучшее решение, которое я здесь отсутствует.

Одна идея, которую я должен был бы иметь все статьи суб-ресурсов (например, /users/:id/shared-articles или /websites/:id/links) поговорить с /links API внутренне, которая сама по себе будет иметь дело с манипуляцией я упоминаю выше. Проблема тогда в том, что мне нужно было бы сделать /links очень многословным в заголовках/параметрах запроса, которые ему нужны, чтобы разрешить различные запросы к базе данных, необходимые (например, те, которые показаны двумя конечными точками субресурсов, показанные здесь).

Есть ли лучшее решение/абстракция здесь?

ответ

1

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

создать сервис/links.js:

module.exports = { 
    manipulateLinks: function (response) { 
     // Manipulate code 
     return response 
    } 
} 

Тогда в вас маршруты, вызовите функцию:

var linkservice = require('../service/links') 
var response = linkservice.manipulateLinks(response) 
+0

То есть то, что я предложил в мой оригинальный пост. Я хотел бы знать, есть ли лучшие способы справиться с этим. –

+0

Нет, это довольно простая абстракция. Все, что было больше, было бы странно. –

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