当前位置: 首页 > 知识库问答 >
问题:

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

王宜
2023-03-14

在使用MongoDB的ExpressJS示例中,这是一个关于相关/嵌套资源的RESTful路由设计的一般设计问题。总之,我应该如何设计此类嵌套/链接管线?

关于我的应用程序/场景:我用NodeJS/ExpressJS和MongoDB实现了一个RESTful服务。我有两种不同的相关模型,分类和文章。

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
    }
});

我找到了两种方法来设计关系船,分别是路线:

这意味着使用了嵌套路径,并且关系是直接的。

优点是设置文章的类别非常容易,因为可以通过带有快速中间件的标识符路径参数(:类别)预加载它。

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

    let article = new Article(request.body);

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

    ...
});

缺点是很难获得特定用户的所有文章,因为使用这种设计,您只能获得一个类别的所有文章。例如,您只会获得第一个类别的文章,因此如果您使用examle查询进行筛选,您会得到第一个类别的文章吗?user=5您将只找到用户5的第1类文章,而不是用户5的所有文章。

这意味着对于每个资源,没有深度嵌套的路由和单独的“endpoint”。

其优点是,现在可以非常容易地通过高度多样的属性和条件进行过滤,如<代码>?用户=5或?标题=作品。

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

您喜欢哪种设计?是否有处理缺点的最佳实践?

我忘记了我找到这篇文章的具体说明,但它似乎没有处理上述缺点。我对处理它们的方法非常感兴趣。

共有1个答案

公羊渝
2023-03-14

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

  • /类别:列出所有类别
  • /类别/:分类ID:如果您决定使类别列表很少,这可能会提供有关一个类别的额外详细信息
  • /类别/:分类ID/用户具有给定类别的所有用户
  • /类别/:分类ID/用户?性别=M给定类别内的所有男性用户
  • /文章列出所有文章
  • /文章/:文章ID列出有关文章ID的更多详细信息

在此处查看资源命名

其想法是-如果您想要更多详细信息,例如,/类别/:categoryId,而我只想要用户,我可以将路由定义/类别/:categoryId?选择=用户

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

 类似资料:
  • 我的问题是关于在为API目的构建URL时嵌套资源的优势。请考虑以下两种访问员工资源的备选方案: 现在考虑开发一个通用库以从API访问REST资源的任务。如果所有路由都是平坦的,这样的REST包装库只需要知道要访问的资源的名称: 但是,如果我们要支持嵌套路由,这个包装器将需要知道关于嵌套了哪些模型以及在哪个其他资源下的额外信息,以便知道如何构建引用这样一个模型的URL。考虑到并非所有模型都嵌套在同一

  • 我需要实现一个在我看来更适合SOAP而不是RESTful服务的搜索,因此我正在努力将其表达为RESTendpoint。 公司(companyId) 合同(Contractd,companyId,privilegeGroupId) PrivilegeGroup(privilegeGroupId,privilegeId) 特权(privilegeId) 主键以粗体显示。 FindPrivilegesB

  • 资源路由 支持设置RESTFul请求的资源路由,方式如下: Route::resource('blog','index/blog'); 表示注册了一个名称为blog的资源路由到index模块的Blog控制器,系统会自动注册7个路由规则,如下: 标识 请求类型 生成路由规则 对应操作方法(默认) index GET blog index create GET blog/create create s

  • 等等。现在,我已经看到了一些公开路径的web服务API,如或。路径的批准部分似乎更像是问题可能具有的属性(在本例中),我想知道这是否可以,以及使它成为请求参数和路径的一部分之间的界限在哪里? 在web服务中公开以某种方式公开系统中的一个预期资源的路径(如本例中的)是否可以,但除了正常的路径之外,还可以通过类似于的路径公开这些路径?规则是什么,这应该是怎样的? 如果我没有人要问,我会创建一个类似:g

  • 我想像下面这样嵌套资源。 但我不能得到请求。团队中的params[“dashboard_id”]参数,因为它似乎已被参数值替换。我试图通过调用一个中间函数来传递问题,并将参数传递到某个地方,但我不知道在哪里…你有答案吗?谢谢,佛朗哥

  • 1. 前言 本小节我们介绍如何嵌套使用 VueRouter。嵌套路由在日常的开发中非常常见,如何定义和使用嵌套路由是本节的重点。同学们在学完本节课程之后需要自己多尝试配置路由。 2. 配置嵌套路由 实际项目中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件,例如: /article/vue /a