Express 官网文档翻译-3.1-路由
路由
路由 指的是能够响应客户端请求的应用端点(URIs)。想了解关于路由的介绍,请查看基本路由。
Express 的 app
对象定义了一些和HTTP 请求方法相对应的成员方法,通过这些方法,你可以定义路由;例如, app.get()
可以处理 GET 请求,app.post
可以处理 POST 请求。想获得全部的方法列表,请查看 app.METHOD。你也可以使用 app.all() 去处理所有的 HTTP 请求,使用 app.use() 指定中间件来作为回调函数(想了解更多中间件的信息,请查看 使用中间件 )。
当应用接收到一个客户端请求时,根据HTTP 方法和路由,那些路由方法会执行对应的回调函数(有时也称为处理器函数)。换句话说,应用会监听请求并且去匹配路由和方法,一旦匹配成功,就会调用对应的回调函数。
实际上,路由方法可以有不止一个回调函数来作为参数。在有多个回调函数的情况下,会向回调函数提供 next
参数,这个很重要。通过在方法内调用 next()
,控制权会流转到下一个回调函数。
下面是一个非常基础的路由的例子。
var express = require('express')
var app = express()
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function (req, res) {
res.send('hello world')
})
路由方法
路由方法派生自 HTTP 方法,是 express
类的实例的成员方法。
下面的例子演示了如何在应用根实例下定义 GET 和 POST 路由方法。
// GET 路由方法
app.get('/', function (req, res) {
res.send('GET request to the homepage')
})
// POST 路由方法
app.post('/', function (req, res) {
res.send('POST request to the homepage')
})
Express 定义了所有和HTTP 请求方法相对应的成员方法:get, post 等等。想获得全部的方法列表,请查看 app.METHOD。
app.all() 是一个特殊的路由方法, 用于在某个路径下接受所有的 HTTP 请求,并执行中间件。例如,下面定义的这个处理器会在路由「/secret」下被调用,不论是 GET, POST, PUT, DELETE, 还是任何 HTTP 支持的请求方法。
app.all('/secret', function (req, res, next) {
console.log('Accessing the secret section ...')
next() // pass control to the next handler
})
路由路径
路由的路径和请求方法一起定义了请求指向的端点。路由路径可以是字符串、字符串模式或正则表达式。
字符 ?
、+
、*
和 ()
与它们在正则表达式中的含义一致。连字符(-
)和点(.
)没有特殊含义。
如果你想在字符串模式中使用美元符 ($
) ,需要使用转义符,并且包括在([
和 ])
中。例如,请求一个字符串模式的路径「/data/$book
」,应该写成「/data/([\$])book
」。
Express 也使用 path-to-regexp 匹配路由路径;想了解关于定义路由路径的所有可能性,请查看正则匹配路径的文档。Express 路由测试器 是一个测试 Express 基础路由的便捷工具,但它不支持模式匹配。
查询字符串不属于路由路径的一部分。
下面是一些字符串类型的路由路径的例子。
这个路由路径将匹配请求到根路径,/
。
app.get('/', function (req, res) {
res.send('root')
})
这个路由路径将匹配请求到 /about。
app.get('/about', function (req, res) {
res.send('about')
})
这个路由路径将匹配请求到 /random.text
。
app.get('/random.text', function (req, res) {
res.send('random.text')
})
下面是一些字符串类型的路由路径的例子。
这个路由路径将匹配 acd
和 abcd
。
app.get('/ab?cd', function (req, res) {
res.send('ab?cd')
})
这个路由路径将匹配 abcd, abbcd, abbbcd 等等。
app.get('/ab+cd', function (req, res) {
res.send('ab+cd')
})
这个路由路径将匹配 abcd
, abxcd
, abRANDOMcd
, ab123cd
等等。
app.get('/ab*cd', function (req, res) {
res.send('ab*cd')
})
这个路由路径将匹配 /abe
和 /abcde
。
app.get('/ab(cd)?e', function (req, res) {
res.send('ab(cd)?e')
})
下面这些例子是正则表达式类型的路由路径:
这个路由路径将匹配任何包含“a”的路径。
app.get(/a/, function (req, res) {
res.send('/a/')
})
这个路由路径将匹配 butterfly
和 dragonfly
,但不匹配 butterflyman
, dragonflyman
等。
app.get(/.*fly$/, function (req, res) {
res.send('/.*fly$/')
})
路由参数
路由参数是 URL 片段,可以用来捕获 URL 指定位置的值。捕获来的路由参数值也包含在 req.params
对象里。路由路径中的参数名字作为各自的键值。
路由路径 : /users/:userId/books/:bookId
请求 URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }
下面这个例子演示了如何在路由路径中定义路由参数。
app.get('/users/:userId/books/:bookId', function (req, res) {
res.send(req.params)
})
路由参数的名字必须是「字符串」([A-Za-z0-9_])。
由于连字符(-
)和点(.
)没有特殊意义,因此它们可以与路由参数一起用于有用的场景。
路由路径: /flights/:from-:to
请求 URL: http://localhost:3000/flights/LAX-SFO
req.params: { "from": "LAX", "to": "SFO" }
路由路径: /plantae/:genus.:species
请求 URL: http://localhost:3000/plantae/Prunus.persica
req.params: { "genus": "Prunus", "species": "persica" }
你也可以在路由参数后附加正则表达式,正则表达式需要写在 (()
)里,来更精确的匹配路由参数:
路由路径: /user/:userId(\d+)
请求 URL: http://localhost:3000/user/42
req.params: {"userId": "42"}
因为正则表达式通常也是字符串的一部分,所以如果要使用正则表达式本身的含义,请使用转义字符 \
来转义。例如 \\d+
。
在 Express 4.x ,
*
没有被被解释为正则表达式中的含义。可以使用{0,}
代替*
,来作为过渡方案。这个问题可能会在 Express 5 中修复。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。