在带有MongoDB的ExpressJS的示例中,这是有关相关/嵌套资源的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
。
优点是设置文章类别的超级容易,因为可以通过 identifier path param(:category)与快速中间件预先加载。
router.post('/', (request, response, next) => {
let article = new Article(request.body);
article.category = request.category; // Preloaded category
...
});
缺点是很难按特定用户获取所有文章,因为采用这种设计,您只能获得一个类别的所有文章。对于示例/api/categories/1/articles
,您只会获得第一类的文章,因此,如果用示例?user=5
的查询进行过滤,则只会找到类别5的用户5的文章,但并非全部用户5的文章中的内容。
这意味着没有深度嵌套的路由,并且每个资源/api/categories/:category
AND /api/articles/:article
都没有单独的“端点”。
优点是,现在可以非常容易地通过?user=5
或?title=Works
等高度多样化的属性和条件进行过滤。
一个很大的缺点是现在我不能只为类别使用路径参数标识符,因为它不存在。这意味着用户必须在请求正文中指定类别。是否有最佳实践来实现这一目标?
您希望使用哪种设计,是否有最佳实践来解决不利因素?
我忘记了我找到这个article的指定,但似乎并没有解决上述缺点。我对处理这些问题的方式非常感兴趣。
答案 0 :(得分:0)
如果我对您的理解正确,则可以考虑以下路线:
/categories
:列出所有类别/categories/:categoryId
:如果您决定使类别列表很少,这可能会提供有关一个类别/categories/:categoryId/users
具有给定类别的所有用户/categories/:categoryId/users?gender=M
给定类别中的所有男性用户/articles
列出所有文章/articles/:articleId
列出有关商品ID的更多详细信息这个想法是
-如果您需要更多详细信息,例如/categories/:categoryId
,我只需要用户,我可以将路由定义为categories/:categoryId?select=users
请注意,这些只是改进代码的建议。如果在用尽所有选项后仍无法遵循建议的建议,建议您在评论表中详细描述异常并继续。