Javascript 节点API设计与重用代码

Javascript 节点API设计与重用代码,javascript,node.js,api,rest,abstract,Javascript,Node.js,Api,Rest,Abstract,我的API有三个端点:文章,网站,和用户。每一篇文章都与一个网站相关联。用户还可以共享文章 在我的API中,我刚刚在/website/:id/articles上创建了一个端点。这将在数据库中查询与给定网站相关的文章。然后,它根据与API对话的人对每篇文章的数据执行一些操作(“例如,用户是否共享了这篇文章?”) 我现在继续在/users/:id/shared articles创建一个类似的端点。对此的数据库查询略有不同,但我希望在查询后对文章数据执行的操作与之前相同 以下是前一个端点的一些伪代码:

我的API有三个端点:
文章
网站
,和
用户
。每一篇
文章
都与一个
网站
相关联。
用户
还可以共享
文章

在我的API中,我刚刚在
/website/:id/articles
上创建了一个端点。这将在数据库中查询与给定
网站相关的
文章
。然后,它根据与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)
      })
    })
  })
})
然而,我认为在Node中设计API时,这种代码重用问题一定很常见,我想知道是否有一个明显更好的解决方案,我在这里没有

我的一个想法是让所有的文章子资源(如
/users/:id/共享文章
/websites/:id/链接
)与
/links
API内部对话,API本身将处理我上面提到的操作。然后,问题是我必须在它需要的查询头/参数中使
/links
非常详细,以便允许不同的数据库查询(例如这里演示的两个子资源端点的查询)

这里有更好的解决方案/抽象吗?

您可以创建一个“服务”层。将链接操作抽象为一个完全独立的文件,并从每个路由调用它

创建一个服务/links.js:

module.exports = {
    manipulateLinks: function (response) {
        // Manipulate code
        return response
    }
}
然后在路由中,调用函数:

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

这就是我在最初的帖子中提出的建议。我想知道是否有更好的方法来处理这个问题。不,这是非常简单的抽象。任何比这更奇怪的事情。