ExpressJS - 嵌套/链接资源的 RESTful 路由设计

Posted

技术标签:

【中文标题】ExpressJS - 嵌套/链接资源的 RESTful 路由设计【英文标题】:ExpressJS - RESTful route design for nested/linked resources 【发布时间】:2019-07-07 05:40:42 【问题描述】:

在 ExpressJS with MongoDB 的示例中,这是一个关于为相关/嵌套资源设计 RESTful 路由的一般设计问题。 综上所述,我应该如何设计这种嵌套/链接的路由?

关于我的应用程序/场景:我有一个使用 NodeJS/ExpressJSMongoDB 实现的 RESTful 服务。我有两个不同的相关模型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

优点是设置文章的类别非常容易,因为可以通过 identifier path param (:category) 和 express 中间件预加载它。

router.post('/', (request, response, next) => 

    let article = new Article(request.body);

    article.category = request.category; // Preloaded category

    ...
);

缺点是很难获得特定用户的所有文章,因为通过这种设计,您只能获得一个类别的所有文章。例如/api/categories/1/articles,您只会获得第一个类别的文章,因此如果您使用查询进行过滤,例如?user=5,您将仅找到用户 5 的类别 1 的文章,但不是所有用户 5 的文章.

面向无障碍

这意味着每个资源/api/categories/:category AND /api/articles/:article 没有深层嵌套路由和单独的“端点”。

优点是现在非常容易通过?user=5?title=Works 等高度多样化的属性和条件进行过滤。

一个很大的缺点是现在我不能只使用一个类别的路径参数标识符,因为它不存在。这意味着用户必须在请求正文中指定类别。是否有最佳实践来实现这一点?

您更喜欢哪种设计,是否有任何处理缺点的最佳做法?

编辑

我忘记了找到这个article 的说明,但它似乎没有解决上述缺点。我对处理它们的方法非常感兴趣。

【问题讨论】:

请记住,每次文章碰巧更改其类别时,使用 /path/category/article 之类的内容都会导致链接断开。 【参考方案1】:

如果我理解正确的话,你可以考虑以下路线:

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

看看Resource Naming here

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

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

【讨论】:

以上是关于ExpressJS - 嵌套/链接资源的 RESTful 路由设计的主要内容,如果未能解决你的问题,请参考以下文章

REST 复杂/复合/嵌套资源 [关闭]

REST - 使用单个 POST 创建嵌套资源

REST复合/复合/嵌套资源[关闭]

属于经过身份验证的用户的嵌套资源的 REST 路径命名约定是啥?

为嵌套资源设计rest api

Django REST Framework 中的嵌套资源