Мой 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
очень многословным в заголовках/параметрах запроса, которые ему нужны, чтобы разрешить различные запросы к базе данных, необходимые (например, те, которые показаны двумя конечными точками субресурсов, показанные здесь).
Есть ли лучшее решение/абстракция здесь?
То есть то, что я предложил в мой оригинальный пост. Я хотел бы знать, есть ли лучшие способы справиться с этим. –
Нет, это довольно простая абстракция. Все, что было больше, было бы странно. –