Express 是一个流行的基于 Node.js 的 Web 开发框架,它可以帮助我们快速搭建一个 Web 应用程序。在 Express 中,路由是一个非常重要的概念。路由指的是根据客户端请求的不同路径和 HTTP 方法来执行不同的处理逻辑。在本篇博客中,我们将介绍如何在 Express 中进行路由配置。
1.基础路由配置
在 Express 中,我们可以通过调用 express()
函数来创建一个应用程序实例。然后,我们可以使用该实例的 get()
、post()
、put()
、delete()
等方法来配置路由。这些方法接收两个参数:路径和处理函数。
在上面的示例中,我们定义了两个路由:根路径和 /about
路径。当客户端请求根路径时,处理函数将返回一个字符串 Hello, World!
,而当客户端请求 /about
路径时,处理函数将返回一个字符串 About us
。
2.动态路由配置
除了静态路由之外,我们还可以定义动态路由。动态路由指的是带有参数的路由,例如 /users/:userId
,其中的 :userId
是一个动态参数,可以匹配不同的用户 ID。在 Express 中,我们可以使用冒号 :
来定义动态参数。
在上面的示例中,我们定义了一个动态路由 /users/:userId
,当客户端请求该路径时,Express 将会调用处理函数,并将匹配的参数值存储在 req.params.userId
属性中。在处理函数中,我们可以通过 req.params.userId
来获取该参数值,并向客户端返回一个包含该参数值的字符串。
3.路由中间件
除了基本路由和动态路由之外,我们还可以使用路由中间件来对路由进行拦截和处理。路由中间件指的是一个函数,它可以在请求到达路由处理函数之前或之后对请求进行处理。
在 Express 中,我们可以使用 app.use()
方法来注册路由中间件。
在上面的示例中,我们定义了一个路由中间件,它会在每个请求到达之前打印当前时间。在处理完中间件逻辑之后,我们需要调用 next()
方法来将请求传递给下一个处理函数。如果我们不调用 next()
方法,请求将会被中断,客户端将会收到一个空白响应。
4.错误处理
在 Express 中,我们可以使用 app.use()
方法来定义错误处理中间件。错误处理中间件指的是一个函数,它可以在发生错误时对错误进行处理,并向客户端返回一个错误响应。
在上面的示例中,我们定义了一个错误处理中间件,它会在发生错误时打印错误堆栈信息,并向客户端返回一个状态码为 500 的错误响应。
5.跨域处理
响应头部-Access-Control-Allow-Origin
'*'代表开放所有的外域url,也可以指定每个url,如 "http://localhost:8081"
响应头部-Access-Control-Allow–Headers
设置允许请求头
响应头部-Access-Control-Allow–Methods
设置允许请求的方法,如GET,POST等待.
在发送真正的请求前,会先发送一个方法为 OPTIONS的预请求,用于试探服务端是否能接受真正的请求.如果options获得的回应时拒绝性质的,如404、403、500等状态,就会停止post、get请求的发出.所以,options成功后才会进行真正的请求.
6.一个简单完整的Express服务
下面是一个完整的 Express 服务示例
const express = require('express')
const app = express()
//跨域处理
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Methods', '*');
res.header('Content-Type', 'application/json;charset=utf-8');
if (req.method.toLowerCase() == 'options')
res.send(200); //让options尝试请求快速结束
else
next();
});
// 中间件示例:打印当前时间
app.use((req, res, next) => {
console.log(`Time: ${new Date()}`)
next()
})
// 动态路由示例
app.get('/users/:userId/books/:bookId', (req, res) => {
const userId = req.params.userId
const bookId = req.params.bookId
res.send(`User ID: ${userId}, Book ID: ${bookId}`)
})
// 错误处理中间件示例
app.use((err, req, res, next) => {
console.error(err.stack)
res.status(500).send('出现一些问题!')
})
// 启动服务
app.listen(3000, () => {
console.log('Example app listening on port 3000!')
})
在上面的代码中,我们定义了一个中间件,它会在每个请求到达之前打印当前时间,然后定义了一个动态路由 /users/:userId/books/:bookId
,它可以处理类似 /users/123/books/456
这样的请求,并从中获取到 userId
和 bookId
参数,最后向客户端返回一个包含这两个参数的响应。最后,我们定义了一个错误处理中间件,它会在发生错误时打印错误堆栈信息,并向客户端返回一个状态码为 500 的错误响应,同时在进行了跨域处理,解决请求时出现跨域而报错.