【问题标题】:Creating Similar Routes with Different Parameters in Nodejs在 Nodejs 中创建具有不同参数的类似路由
【发布时间】:2018-01-13 09:56:45
【问题描述】:

我进行了谷歌搜索,但找不到我真正需要的东西。 我需要查询一个 API,它具有相同的路由,但具有不同的参数。

例子:

router.get('/items/:query, function(){})

在这种情况下,我会搜索所有项目

router.get('/items/:id, function(){})

在这里,我会寻找一个特定的项目

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    问题在于,如果没有额外的模式匹配,Express 将无法区分 /items/:query/items/:id,它们是相同的路由模式,只是参数的别名不同。

    根据您打算如何构建查询,您可能需要考虑使用路由 /items,然后使用查询字符串参数或使用单独的 /items/search/:query 端点。

    【讨论】:

    【解决方案2】:

    问题的核心是您试图在同一位置指定两个不同的资源。如果你设计你的 API 来遵守宁静的原则,你就会明白为什么这不是一个明智的选择。这里有两个很好的起点:

    https://en.wikipedia.org/wiki/Representational_state_transfer

    http://www.restapitutorial.com/lessons/whatisrest.html

    在restful api中,根资源代表项目集合:

    /api/items
    

    ...当您指定一个表明您只想要一个项目的 id 时:

    /api/items/abc123
    

    如果您仍然想完成您在问题中提出的问题,您需要添加一个 url 参数,例如 /items/query?query=true 或 /items/abc123?detail=true 但这会让 99 感到困惑看过您的代码的网络开发人员百分比。

    另外我不确定你是否真的是这个意思,但是当你将一个名为“查询”的变量传递给服务器时,这似乎表明你将要发送一个 SQL 查询(或类似的数据定义语言)客户端进入服务器。出于多种原因,这是一种危险的做法 - 最好将所有此类代码留在您的服务器上。

    编辑:如果您真的绝对肯定必须这样做,那么可能有一个查询参数显示 ?collection=true。这至少会被将来可能必须维护代码的其他开发人员理解。还要确保添加 cmets 来解释为什么你无法实施休息,这样你就不会留下坏名声:)

    【讨论】:

    • 你说得对,我会用另一种方式做,但这是需要做的:(
    • 那么您需要使用我描述的查询参数来标记两种请求类型之间的差异。我想你也可以使用 http 标头。无论如何,如果没有在节点的某处读取标志,就无法完成您所要求的任务。
    猜你喜欢
    • 2013-03-14
    • 2015-07-26
    • 2018-11-09
    • 2019-06-01
    • 2020-02-20
    • 2015-07-13
    • 2017-10-10
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多