Node.js Express 是一个流行的 Web 应用程序框架,它使用 JavaScript 运行在服务器端。在开发 Web 应用程序时,我们经常需要在处理请求之前执行一些操作,比如验证用户身份或者记录日志。Express 提供了一种简单的方式来在每个 HTTP 请求之前执行钩子函数,以便我们可以在处理请求之前执行一些操作。
在 Express 中,我们可以使用 app.use() 方法来注册一个全局的中间件函数,该函数将在每个 HTTP 请求到达服务器之前被调用。中间件函数可以执行一些通用的操作,比如解析请求体、处理跨域请求、设置响应头等。例如,我们可以创建一个名为 `logger` 的中间件函数来记录每个请求的信息:javascriptconst express = require('express');const app = express();// 定义一个全局的中间件函数app.use((req, res, next) => { console.log(`Received ${req.method} request for ${req.url}`); next(); // 调用 next() 函数以便继续处理请求});// 处理 GET 请求app.get('/', (req, res) => { res.send('Hello, World!');});app.listen(3000, () => { console.log('Server is running on port 3000');});在上面的例子中,我们使用 `app.use()` 方法注册了一个全局中间件函数,该函数会在每个请求到达服务器之前被调用。中间件函数接收三个参数:`req` 表示请求对象,`res` 表示响应对象,`next` 是一个函数,用于调用下一个中间件或者路由处理函数。在中间件函数中,我们简单地打印了每个请求的方法和 URL,并调用了 `next()` 函数以便继续处理请求。注意,中间件函数的顺序很重要,它们会按照注册的顺序依次执行。在上面的例子中,我们在定义 GET 请求处理函数之前注册了中间件函数,所以中间件函数会在处理 GET 请求之前被调用。使用 app.get() 和 app.post() 注册特定路由的中间件除了全局中间件函数,我们还可以为特定的路由注册中间件函数。在 Express 中,我们可以使用 `app.get()` 或者 `app.post()` 方法来定义特定的路由处理函数,并且可以在这些方法调用之前注册中间件函数。例如,我们可以创建一个名为 `authMiddleware` 的中间件函数来验证用户身份,并在处理特定路由之前执行该中间件函数:
javascriptconst express = require('express');const app = express();// 定义一个全局的中间件函数app.use((req, res, next) => { console.log(`Received ${req.method} request for ${req.url}`); next(); // 调用 next() 函数以便继续处理请求});// 定义一个特定路由的中间件函数const authMiddleware = (req, res, next) => { if (req.headers.authorization === 'Bearer token') { next(); // 用户身份验证通过,调用 next() 函数继续处理请求 } else { res.status(401).send('Unauthorized'); // 用户身份验证失败,返回 401 Unauthorized 响应 }}// 处理 GET 请求app.get('/', authMiddleware, (req, res) => { res.send('Hello, World!');});app.listen(3000, () => { console.log('Server is running on port 3000');});在上面的例子中,我们定义了一个名为 `authMiddleware` 的中间件函数来验证用户身份。在处理 GET 请求之前,我们使用 `app.get()` 方法注册了该中间件函数。当用户发送 GET 请求时,中间件函数会首先被调用进行身份验证,只有当身份验证通过时,才会继续处理请求并返回 "Hello, World!" 响应。否则,如果身份验证失败,我们会返回一个 401 Unauthorized 的响应。在这个例子中,我们可以看到通过在特定路由之前注册中间件函数,我们可以在处理特定路由之前执行一些操作,比如验证用户身份。这种方式可以帮助我们实现更加灵活和可维护的代码结构。