为什么 Express.js 识别的 URL 不像我们通常看到的 URL?

Why is URL recognized by Express.js not like the usual URLs that we see?

为什么 Express.js 可以识别的 URL 与我们通常看到的 URL 不同?

例如: Express.js 将识别此 URL (http://localhost:3000/things/0) 如果我发出此 GET 请求,其中 id=0:

app.get('/things/:id', (req, res) => {
   // Do somethihng
});

但是这个 URL (http://localhost:3000/things/?id=0) 更像是我们通常看到的 URLs 不适用于相同的 GET以上请求。

(http://localhost:3000/things/?id=0) which is more like the usual URLs

它是一个框架,它并不像你我想的那样。它有一套规则。 谈到RESTFULAPI的最佳实践,设计是路径参数(/:id)用于标识特定资源或资源,而查询parameters(?id) 用于 sort/filter 这些资源。所以,对于/things/?id=0,我们应该使用查询参数。

we see won't work for the same GET request above.

那样不行。为了获取查询参数,请使用类似

app.get('/things', (req, res) => {
   let id = req.query.id;
// here you can get id.
});

查询参数: How to get GET (query string) variables in Express.js on Node.js?

关于 URL:https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL

因此,“普通 URLs”显然是在旁观者的眼中,因为真的只是不同的风格,没有比另一个更正常。

在 URL.

中有几种传递参数的方法

#1 - 您可以将其嵌入 URL

的路径中
https://someserver/things/0
https://contacts.google.com/person/c3429579852656514228

这称为 RESTFUL 设计。这些 URL 包含一个名词,然后是一个标识 URL 指代的名词的 ID。

#2 - 您可以将 URL 的可变部分放在查询参数中

对于上面相同的两个 URL,可能如下所示:

https://someserver/things?id=0
https://contacts.google.com/person?id=c3429579852656514228

这两种设计都有正当理由,具体取决于具体情况,甚至在某些情况下您将两者结合使用(将可选查询参数添加到选项 #1 中的 restful API 设计中。两者都不是是“正常的”——它们是设计您的 URLs 的不同方式。

Express 允许您使用其中任何一种。对于 URL 路径中的 restful 参数,您使用 :id 语法并访问 req.params.id:

中的值
app.get('/things/:id', (req, res) => {
   console.log(req.params.id);
   res.send(req.params.id);
});

对于查询参数,您不在快速路由路径中定义它们。相反,Express 解析任何路由上存在的任何查询参数,并使它们在 req.query.

中可用
// expecting /things?id=789&sort=alpha
app.get('/things', (req, res) => {
   console.log(req.query.id);            // "789"
   console.log(req.query.sort);          // "alpha"
   res.send(req.query.id);
});

URL 中存在的任何查询参数都将添加到 req.query 对象。

请注意,查询参数通常被认为是可选的,因此您不会将它们编码到路由定义中。如果你想要求一个特定的查询参数,那么你必须检查它是否存在,如果不存在,则提供一些错误响应或调用 next() 继续路由到其他请求处理程序。


仅供参考,还有另一种样式经常使用客户端代码来帮助构建该页面并将 URL 参数也放入哈希标记中,但我将在以后再讨论。