Node.js Express:在 app.get() 和 app.post() 之前对每个 HTTP 请求执行钩子

作者:编程家 分类: 编程代码 时间:2025-10-15

Node.js Express 是一个流行的 Web 应用程序框架,它使用 JavaScript 运行在服务器端。在开发 Web 应用程序时,我们经常需要在处理请求之前执行一些操作,比如验证用户身份或者记录日志。Express 提供了一种简单的方式来在每个 HTTP 请求之前执行钩子函数,以便我们可以在处理请求之前执行一些操作。

在 Express 中,我们可以使用 app.use() 方法来注册一个全局的中间件函数,该函数将在每个 HTTP 请求到达服务器之前被调用。中间件函数可以执行一些通用的操作,比如解析请求体、处理跨域请求、设置响应头等。例如,我们可以创建一个名为 `logger` 的中间件函数来记录每个请求的信息:

javascript

const 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` 的中间件函数来验证用户身份,并在处理特定路由之前执行该中间件函数:

javascript

const 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 的响应。

在这个例子中,我们可以看到通过在特定路由之前注册中间件函数,我们可以在处理特定路由之前执行一些操作,比如验证用户身份。这种方式可以帮助我们实现更加灵活和可维护的代码结构。