下面是“浅探express路由和中间件的实现”完整攻略:
1. 什么是路由
路由(router)是一种把 HTTP 请求对应到相应处理程序的技术。express.js 框架的路由系统是其核心功能之一,负责处理客户端请求并将其发送到相应的处理程序。express 中的路由器是一个中间件(listener)和一个处理程序(handler)的组合。
2. express路由的实现
在 Express 应用程序中创建路由的基本方法如下:
const express = require('express')
const app = express()
// 响应客户端GET请求
app.get('/path', (req, res) => {
res.send('Hello World!')
})
// 响应客户端POST请求
app.post('/path', (req, res) => {
res.send('Got a POST request')
})
// 响应客户端任何请求类型的请求
app.all('/path', (req, res) => {
res.send('Got any request')
})
其中 app.get
和 app.post
是两种不同类型的路由,它们分别用于响应 GET 和 POST 请求。app.all
方法用于响应所有 HTTP 请求类型,可以用于注册中间件,如下所示:
app.all('/', (req, res, next) => {
console.log('这是一个中间件。')
next()
})
app.get('/path', (req, res) => {
res.send('Hello World!')
})
3. express中间件的实现
在 Express 中,中间件是函数,它可以接收同一请求并产生不同的响应。可以利用中间件来处理 HTTP 请求并完成后续处理。常见的用途包括:
- 执行身份验证
- 处理请求和响应信息,如 body-parser
- 处理静态资源
- 处理文件上传
下面是一个简单的中间件示例:
app.use('/', (req, res, next) => {
console.log('Time:', Date.now())
next()
})
该中间件函数处理客户端请求,打印时间戳,然后通过调用 next()
函数将请求传递给下一层中间件处理。如果当前中间件没有调用 next()
函数,则请求将被终止。
4. 示例说明
下面是两个示例,分别介绍了如何使用路由和中间件。
示例一:使用路由实现一个 RESTful API
const express = require('express')
const app = express()
const books = [
{ id: 1, name: 'book1' },
{ id: 2, name: 'book2' },
{ id: 3, name: 'book3' }
]
// 获取图书列表
app.get('/api/books', (req, res) => {
res.send(books)
})
// 根据 id 获取图书信息
app.get('/api/books/:id', (req, res) => {
const book = books.find(b => b.id === parseInt(req.params.id))
if (!book) return res.status(404).send('The book is not found.')
res.send(book)
})
// 添加图书
app.post('/api/books', (req, res) => {
const book = { id: books.length + 1, name: req.body.name }
books.push(book)
res.send(book)
})
// 更新图书信息
app.put('/api/books/:id', (req, res) => {
const book = books.find(b => b.id === parseInt(req.params.id))
if (!book) return res.status(404).send('The book is not found.')
book.name = req.body.name
res.send(book)
})
// 删除图书
app.delete('/api/books/:id', (req, res) => {
const book = books.find(b => b.id === parseInt(req.params.id))
if (!book) return res.status(404).send('The book is not found.')
const index = books.indexOf(book)
books.splice(index, 1)
res.send(book)
})
app.listen(3000, () => {
console.log('Server listening on port 3000.')
})
该示例使用了不同类型的路由来实现一个 RESTful API。GET 方法用于获取资源;POST 方法用于创建资源;PUT 方法用于更新资源;DELETE 方法用于删除资源。
示例二:使用中间件处理请求
const express = require('express')
const app = express()
// 日志中间件
app.use((req, res, next) => {
console.log(req.method, req.url)
next()
})
// 鉴权中间件
app.use('/api', (req, res, next) => {
const token = req.headers['authorization']
if (!token) return res.status(401).send('You are not authorized.')
next()
})
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.get('/api/users', (req, res) => {
res.send('User list.')
})
app.listen(3000, () => {
console.log('Server listening on port 3000.')
})
在该示例中,第一个中间件是日志中间件,用于记录请求的方法和 URL 地址;第二个中间件是鉴权中间件,用于判断请求头部是否包含了 authorization 字段。对于所有以 /api
开头的请求,都需要通过鉴权中间件的验证才能继续进行下一步操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅探express路由和中间件的实现 - Python技术站