NodeJS + Express 第三部分:中间件
这里将有一系列文章,帮助你使用NodeJS + Express创建后端应用程序。
本系列文章是我之前NodeJS基础系列文章的续篇。如果您对NodeJS没有基础知识,请先阅读这篇系列文章:NodeJS入门
如今Node.js已成为必备工具,因此对于开发人员来说,掌握它至关重要。
所以我会大约每两天发布一篇新文章,慢慢地,你就能学到关于Node.js + Espress的所有知识。
为了不错过任何消息,请在推特上关注我:https://twitter.com/EricTheCoder_
中间件
中间件是在向服务器发出请求期间执行的函数。这些函数可以访问请求和响应参数,因此可以执行许多操作来增强/自动化 API 功能。
中间件位于请求和响应之间
user request -> midlleware -> response
创建你的第一个中间件
假设我们想要一个函数,在每次访问页面时记录请求的 URL 地址。
如果没有中间件,我们可以用这样的代码实现这个功能:
app.get('/about', (req, res) => {
console.log(req.url)
console.log(req.params)
console.log(req.query)
return res.send('About Page')
})
这样做当然没问题,但如果我们有 100 条不同的路由呢?我们不可能把那些 console.log() 代码复制粘贴到每条路由上。
一种解决方案是将这些日志放入中间件函数中。
const logger = (req, res, next) => {
console.log(req.url)
console.log(req.params)
console.log(req.query)
next()
}
这是一个非常简单的函数。你已经熟悉了 req 和 res 参数。这里的新内容是 next() 函数。next() 函数是 Espress 的一个预定义函数,它将控制权交还给调用路由。执行 console.log() 后,请求需要继续沿着调用路由的路径进行。
以下是一个完整的中间件示例
const logger = (req, res, next) => {
console.log(req.url)
console.log(req.params)
console.log(req.query)
next()
}
app.use(logger) // execute your middleware for all requests
app.get('/about', (req, res) => {
return res.send('About Page')
})
当用户访问 /about 时,Express 会执行 app.get()。但在此之前,它会先执行 app.use() 中指定的中间件。中间件执行完毕后,next() 会继续执行 app.get()。
以下是执行顺序:
客户端请求 → /about ⇒ logger() → app.get() → 客户端响应
创建中间件时,并非必须使用 `next()`。您可以发送自己的响应,并完全覆盖/省略 `app.get()`。
const logger = (req, res, next) => {
console.log(req.url)
console.log(req.params)
console.log(req.query)
res.send('Custom About page')
}
以下是执行顺序:
客户端请求 → /about ⇒ logger() → 客户端响应
如果中间件仅适用于一个或两个路由,则可以使用此语法仅针对这些路由执行中间件。
const logger = (req, res, next) => {
console.log(req.url)
console.log(req.params)
console.log(req.query)
next()
}
app.get('/about', logger, (req, res) => {
return res.send('About Page')
})
请注意,我们没有使用 app.use(),而只是将中间件函数指定为 app.get() 的参数。
您还可以仅对特定路径下的请求执行中间件,例如:/api
app.use('/api', logger)
可以使用多个中间件。
app.use([logger, auth])
请注意,中间件将按照声明的顺序执行。
中间件可以更改请求对象
const auth = (req, res, next) => {
const user = req.query.user
if (user === 'admin') {
req.user = ( name: 'admin', id: 1 }
next()
} else {
res.status(401).send('Unauthorized')
}
}
在最后一个示例中,我们将一个用户对象添加到请求中。现在可以在路由中使用该用户对象。
app.use(auth)
app.get('/about', (req, res) => {
console.log(req.user)
return res.send('About Page')
})
这个例子已经非常简化了,但它展示了中间件的真正强大之处。
结论
今天就到这里,请在推特上关注我:https://twitter.com/EricTheCoder_,以便在下一篇文章发布时收到通知(两天内)。
文章来源:https://dev.to/ericchapman/nodejs-express-part-3-middleware-3528