【问题标题】:Express: req.params vs req.body (JSON)快递:req.params 与 req.body (JSON)
【发布时间】:2019-07-21 00:45:27
【问题描述】:

哪个更正确,为什么?这取决于场景吗?有标准吗?

router.post("/user", function(req, res) {
  let thisUserId = req.body.userId;
});

router.post("/user/:userId", function(req, res) {
  let thisUserId = req.params.userId;
}

谢谢!

【问题讨论】:

  • 你想在函数内部做什么?
  • @Kepotx 创建一个用户,在这个例子中。

标签: node.js rest express


【解决方案1】:

这个问题更多的是关于 RESTful API 约定,而不是 node 或 express。基于普遍接受的REST conventions,这是基本的CRUD操作:

/* fetch all users */
GET /users 

/* fetch specific user */
GET /users/:userId

/* create new user */
POST /users 

/* edit specific user */
PUT /users/:userId

/* delete specific user */
DELETE /users/:userId

所以在你的情况下,考虑到你想创建一个用户,我会说req.body 更合适。

EDIT:支持此案例的另一个有用资源:10 best practices for better RESTful API

【讨论】:

    【解决方案2】:

    req.body 用于访问您“发布”的实际表单数据。

    req.params 用于路由参数,在您的情况下userId 是在参数中传递的:

    router.post("/user/:userId", function(req, res) {
      let thisUserId = req.params.userId;
    }
    

    官方文档:

    req.body

    包含请求中提交的数据键值对 身体。默认情况下,它是未定义的,并在您使用时填充 body-parser 和 multer 等正文解析中间件。

    Link to req.body docs

    req.params

    此属性是一个包含映射到的属性的对象 命名的路线“参数”。例如,如果您有路线 /user/:name,则“name”属性可用作 req.params.name。 此对象默认为 {}。

    Link to req.params docs

    如果您想在依赖该 id(现有用户)的路由中实现守卫或任何其他逻辑,则在参数中传递 userID。

    假设您正在提交一个新用户注册的表单。您不想在参数中发送凭据,因为它是机密数据,并且可以通过这种方式轻松访问。在这里将这些值放在请求正文中并因此使用 req.body..

    是有意义的

    正如 Haris Bouchlis 在他的回答中已经提到的,这取决于您喜欢执行的 CRUD 操作。

    【讨论】:

    • 这并不能真正回答我的问题,即为什么?为什么我会选择一个而不是另一个?谢谢。
    • @chrisheseltine 假设您提交了一个新用户注册的表单。您不想在参数中发送凭据,因为它是机密数据并且可以通过这种方式轻松访问。在这里将这些值放在请求正文中并因此使用req.body.. 是有意义的
    • @chrisheseltine 很高兴 - 如果你愿意,你可能想接受我或哈里斯的回答;)
    【解决方案3】:

    在这种情况下,我建议使用 req.params.userId。

    普通的 API 条目有这个标准。要获取所有用户,路径将是“/用户”。 要检索或更新特定用户,路径将为“/users/1”。

    API example

    【讨论】:

      【解决方案4】:

      是的,有完全不同的,用于不同的目的

      1.req.params 来自与路由定义中的参数匹配的 URL 路径段,例如 /song/:songid。因此,使用使用该名称的路由和 /song/48586 等 URL,然后 req.params.songid === "48586"。

      2.req.body 属性来自表单帖子,其中表单数据(在正文内容中提交)已被解析为正文标签的属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 2018-07-11
        • 2021-04-14
        • 2019-02-15
        • 2018-12-12
        • 2021-10-02
        • 2014-09-18
        相关资源
        最近更新 更多