Express 官网文档翻译-3.1-路由

Node.js

路由

路由 指的是能够响应客户端请求的应用端点(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')
})

这个路由路径将匹配  abcdabxcdabRANDOMcdab123cd 等等。

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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:http://www.expressjs.com.cn/guide/routin...

译文地址:https://learnku.com/f2e/t/37091

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!