ExpressJS-嵌套/链接资源的恢复路线设计



这是一个通用设计问题,该问题是关于使用mongoDB的ExpressJS示例的相关/嵌套资源的RESTFULE路线的设计。总而言之,我应该如何设计此类嵌套/链接路线?

关于我的应用程序/方案:我已经使用 nodejs/expressjs mongodb 实现了一个重新服务。我有两个不同的相关模型CategoryArticle

const mongoose = require('mongoose');
const article = new mongoose.Schema({
    title: {
        type: String,
        required: true
    },
    body: {
        type: String,
        required: true
    },
    category: {
        type: mongoose.Types.ObjectId,
        ref: 'Category',
        required: true
    }
});
const category = new mongoose.Schema({
    name: {
        type: String,
        required: true
    }
});

我找到了两种设计关系船的方法:

关系为方向

这意味着使用嵌套路径,并且关系直接向前/api/categories/:category/articles/:article

Advantage 是设置文章类别非常容易的,因为可以通过Express Middleware。>

router.post('/', (request, response, next) => {
    let article = new Article(request.body);
    article.category = request.category; // Preloaded category
    ...
});

劣势是很难获得特定用户的所有文章,因为使用该设计,您只能获得一个类别的所有文章。例如,/api/categories/1/articles您仅收到第一类的文章,因此,如果您使用检查的查询?user=5过滤,则只会找到1类用户5的文章,但>并非所有用户5的文章的

面向可访问性

这意味着每个资源/api/categories/:category /api/articles/:article

优势是现在非常容易被高度多样化的属性和避难所(例如?user=5?title=Works)过滤。

现在,一个很大的缺点是我不能仅将路径参数标识符用于类别,因为它不存在。用户必须在请求主体内部指定类别。是否有最佳实施?

您想要哪种设计,并且有任何处理不利之处的最佳实践吗?

编辑

我忘记了我找到了本文的指定,但似乎并没有处理上述缺点。我对与他们打交道的方法非常感兴趣。

如果我正确理解您,则可以考虑以下路线:

  • /categories:列出所有类别
  • /categories/:categoryId:如果您决定列出类别列表,这可能会提供有关一个类别
  • 的额外详细信息
  • /categories/:categoryId/users所有具有给定类别的用户
  • /categories/:categoryId/users?gender=M给定类别中的所有男性用户
  • /articles列出所有文章
  • /articles/:articleId列出有关文章ID的更多详细信息

在这里查看资源命名

这个想法是 - 如果您需要更多详细信息,例如/categories/:categoryId,我只想用户,我可以将路由定义为categories/:categoryId?select=users

请注意,这些只是改进代码的建议。如果用完所有选项后,您无法遵守既定建议,我建议您以评论表格详细描述异常并继续进行。

最新更新