当前位置: 代码迷 >> JavaScript >> ExpressJS-嵌套/链接资源的RESTful路由设计
  详细解决方案

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

热度:92   发布时间:2023-06-13 11:33:18.0

在带有MongoDB的ExpressJS的示例中,这是有关相关/嵌套资源的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

优点是设置文章的类别非常容易,因为可以通过带有中间件的标识符路径参数(: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进行过滤。

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

您希望使用哪种设计?是否有最佳实践来解决缺点?

编辑

我忘记了找到这篇的具体内容,但似乎并没有解决所提到的缺点。 我对处理这些问题的方式非常感兴趣。

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

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

在看看

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

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

  相关解决方案