javascript - ExpressJS - 嵌套/链接资源的 RESTful 路由设计
问题描述
在 ExpressJS with MongoDB 的示例中,这是一个关于为相关/嵌套资源设计 RESTful 路由的一般设计问题。总之,我应该如何设计这种嵌套/链接的路线?
关于我的应用程序/场景:我有一个用NodeJS/ExpressJS和MongoDB实现的 RESTful 服务。我有两个不同的相关模型Category
和Article
.
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
。
优点是设置文章的类别非常容易,因为可以使用 express 中间件通过标识符路径参数 (:category) 预加载它。
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
这意味着每个资源AND 没有深层嵌套路由和单独的“端点” /api/articles/:article
。
优点是现在非常容易通过高度多样化的属性和条件(如?user=5
or )进行过滤?title=Works
。
一个很大的缺点是现在我不能只使用类别的路径参数标识符,因为它不存在。这意味着用户必须在请求正文中指定类别。是否有最佳实践来实现这一点?
您更喜欢哪种设计,是否有处理缺点的最佳实践?
编辑
我忘记了我找到这篇文章的具体说明,但它似乎没有解决提到的缺点。我对处理它们的方法非常感兴趣。
解决方案
如果我理解正确,您可以考虑以下路线:
/categories
:列出所有类别/categories/:categoryId
:如果您决定使类别列表很少,这可能会提供有关一个类别的额外详细信息/categories/:categoryId/users
具有给定类别的所有用户/categories/:categoryId/users?gender=M
给定类别内的所有男性用户/articles
列出所有文章/articles/:articleId
列出有关文章 ID 的更多详细信息
在这里查看资源命名
这个想法是-如果您想要更多详细信息,例如/categories/:categoryId
,我只想要用户,我可以将路线定义为categories/:categoryId?select=users
请注意,这些只是改进代码的建议。如果在用尽所有选项后,您无法遵守所述建议,我建议您在评论表中详细描述异常并继续。
推荐阅读
- c# - 错误:合并两个分支后在运行时出现“无法加载文件或程序集 Newtonsoft.Json”。两个分支都运行良好
- typescript - 使用带逗号的十进制将 Typescript 数字输入发送到后端
- postgresql - 将 Scala Slick 与数据库枚举一起使用
- swift - Beautiful Soup Find 等效于 Swift 的函数
- xml - 将 XML 转换为表时是否有正确的结果
- node.js - 猫鼬多字段选择不起作用
- google-apps-script - 谷歌通讯录脚本慢
- javascript - React - 如何在 html5 中捕获全屏视频请求?
- ruby-on-rails - 当 2 列是同一个表的外键时,Rails 3 列之间的唯一性
- javascript - 未捕获的 ReferenceError:尝试将总和分配给值时分配中的左侧无效