推荐答案
在 Express 中,可以通过 app.use() 或 app.METHOD() 方法来定义中间件。中间件是一个函数,它可以访问请求对象 (req)、响应对象 (res) 以及应用程序的请求-响应循环中的下一个中间件函数 (next)。
使用 app.use() 定义中间件
// www.javascriptcn.com code example
const express = require('express');
const app = express();
// 定义一个简单的中间件
app.use((req, res, next) => {
console.log('Time:', Date.now());
next();
});
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});使用 app.METHOD() 定义中间件
// www.javascriptcn.com code example
const express = require('express');
const app = express();
// 定义一个只针对 GET 请求的中间件
app.get('/', (req, res, next) => {
console.log('GET request received');
next();
}, (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});本题详细解读
中间件的作用
中间件在 Express 中扮演着非常重要的角色,它可以执行以下任务:
- 执行任何代码:中间件可以执行任何代码,例如日志记录、身份验证等。
- 修改请求和响应对象:中间件可以修改
req和res对象,例如添加自定义属性或修改头信息。 - 结束请求-响应循环:中间件可以通过调用
res.send()或res.end()来结束请求-响应循环。 - 调用下一个中间件:中间件可以通过调用
next()将控制权传递给下一个中间件。
中间件的类型
- 应用级中间件:通过
app.use()或app.METHOD()绑定到app对象上的中间件。 - 路由级中间件:通过
router.use()或router.METHOD()绑定到express.Router()实例上的中间件。 - 错误处理中间件:专门用于处理错误的中间件,通常有四个参数
(err, req, res, next)。 - 内置中间件:Express 提供的内置中间件,例如
express.static。 - 第三方中间件:通过 npm 安装的第三方中间件,例如
body-parser。
中间件的执行顺序
中间件的执行顺序非常重要,Express 会按照中间件定义的顺序依次执行。如果某个中间件没有调用 next(),那么后续的中间件将不会被执行。
示例:多个中间件的执行顺序
// www.javascriptcn.com code example
const express = require('express');
const app = express();
app.use((req, res, next) => {
console.log('First middleware');
next();
});
app.use((req, res, next) => {
console.log('Second middleware');
next();
});
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});在这个例子中,当访问 / 路由时,控制台会依次输出 First middleware 和 Second middleware,然后才会发送响应 Hello World!。