面试题答案
一键面试中间件主要作用
- 请求处理:在请求到达最终路由处理程序之前,对请求进行预处理,比如解析请求体、验证请求参数等。
- 响应处理:在路由处理程序生成响应后,对响应进行后处理,例如添加响应头、格式化响应数据。
- 功能复用:将一些通用的功能(如日志记录、错误处理)提取出来,通过中间件复用,提高代码的可维护性和可扩展性。
常见应用场景
- 日志记录:记录每一个请求的相关信息,如请求方法、URL、时间等,方便调试和排查问题。例如使用
morgan
中间件,它可以将请求日志打印到控制台。 - 身份验证:验证用户是否有权限访问特定的路由。比如在用户访问需要登录才能操作的页面或接口时,检查用户的登录状态(例如通过检查
cookie
或token
)。 - 错误处理:捕获在请求处理过程中抛出的错误,并进行统一的处理,返回合适的错误信息给客户端。
自定义中间件
在 Express 中自定义中间件非常简单,中间件本质上就是一个函数,该函数接受 (req, res, next)
三个参数。
// 自定义一个简单的日志记录中间件
const logger = function(req, res, next) {
console.log(`${req.method} ${req.url} at ${new Date()}`);
next();
};
// 使用自定义中间件
const express = require('express');
const app = express();
app.use(logger);
// 路由等其他代码
app.get('/', (req, res) => {
res.send('Hello World!');
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
上述代码中,logger
就是一个自定义中间件,通过 app.use(logger)
将其挂载到 Express 应用中。next()
函数用于将控制权传递给下一个中间件或路由处理程序。如果在中间件函数中没有调用 next()
,请求将不会被进一步处理。