发布于 2026-01-06 4 阅读
0

NodeJS + Express 第三部分:中间件

NodeJS + Express 第三部分:中间件

这里将有一系列文章,帮助你使用NodeJS + Express创建后端应用程序。

本系列文章是我之前NodeJS基础系列文章的续篇。如果您对NodeJS没有基础知识,请先阅读这篇系列文章:NodeJS入门

如今Node.js已成为必备工具,因此对于开发人员来说,掌握它至关重要。

所以我会大约每两天发布一篇新文章,慢慢地,你就能学到关于Node.js + Espress的所有知识。

为了不错过任何消息,请在推特上关注我:https://twitter.com/EricTheCoder_


中间件

中间件是在向服务器发出请求期间执行的函数。这些函数可以访问请求和响应参数,因此可以执行许多操作来增强/自动化 API 功能。

中间件位于请求和响应之间

user request -> midlleware -> response
Enter fullscreen mode Exit fullscreen mode

创建你的第一个中间件

假设我们想要一个函数,在每次访问页面时记录请求的 URL 地址。

如果没有中间件,我们可以用这样的代码实现这个功能:

app.get('/about', (req, res) => {
    console.log(req.url)
    console.log(req.params)
    console.log(req.query)
    return res.send('About Page')
})
Enter fullscreen mode Exit fullscreen mode

这样做当然没问题,但如果我们有 100 条不同的路由呢?我们不可能把那些 console.log() 代码复制粘贴到每条路由上。

一种解决方案是将这些日志放入中间件函数中。

const logger  = (req, res, next) => {
    console.log(req.url)
    console.log(req.params)
    console.log(req.query)
    next()
}
Enter fullscreen mode Exit fullscreen mode

这是一个非常简单的函数。你已经熟悉了 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')
})
Enter fullscreen mode Exit fullscreen mode

当用户访问 /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')
}
Enter fullscreen mode Exit fullscreen mode

以下是执行顺序:

客户端请求 → /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')
})
Enter fullscreen mode Exit fullscreen mode

请注意,我们没有使用 app.use(),而只是将中间件函数指定为 app.get() 的参数。

您还可以仅对特定路径下的请求执行中间件,例如:/api

app.use('/api', logger)
Enter fullscreen mode Exit fullscreen mode

可以使用多个中间件。

app.use([logger, auth])
Enter fullscreen mode Exit fullscreen mode

请注意,中间件将按照声明的顺序执行。

中间件可以更改请求对象

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')
    }
}
Enter fullscreen mode Exit fullscreen mode

在最后一个示例中,我们将一个用户对象添加到请求中。现在可以在路由中使用该用户对象。

app.use(auth)

app.get('/about', (req, res) => {
    console.log(req.user)
    return res.send('About Page')
})
Enter fullscreen mode Exit fullscreen mode

这个例子已经非常简化了,但它展示了中间件的真正强大之处。

结论

今天就到这里,请在推特上关注我:https://twitter.com/EricTheCoder_,以便在下一篇文章发布时收到通知(两天内)。

文章来源:https://dev.to/ericchapman/nodejs-express-part-3-middleware-3528