面试题答案
一键面试1. 错误处理中间件设计思路
在Node.js的HTTP服务中,错误处理中间件通常放在所有路由处理函数之后。它捕获在前面路由处理函数中抛出的错误,根据错误类型设置合适的HTTP状态码,并返回相应的错误信息。为了保证性能,应尽量减少不必要的计算和资源消耗。对于可维护性,应保持代码结构清晰,错误类型定义明确。
2. 关键代码示例
const express = require('express');
const app = express();
// 模拟一些错误类型
class BadRequestError extends Error {
constructor(message) {
super(message);
this.name = 'BadRequestError';
this.statusCode = 400;
}
}
class InternalServerError extends Error {
constructor(message) {
super(message);
this.name = 'InternalServerError';
this.statusCode = 500;
}
}
// 模拟路由处理函数
app.get('/test', (req, res, next) => {
throw new BadRequestError('This is a bad request error');
});
// 错误处理中间件
app.use((err, req, res, next) => {
let statusCode = 500;
let errorMessage = 'Internal Server Error';
if (err instanceof BadRequestError) {
statusCode = err.statusCode;
errorMessage = err.message;
} else if (err instanceof InternalServerError) {
statusCode = err.statusCode;
errorMessage = err.message;
}
res.status(statusCode).json({ error: errorMessage });
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
3. 代码说明
- 错误类型定义:定义了
BadRequestError
和InternalServerError
两个自定义错误类,每个类都有自己的statusCode
。 - 路由处理函数:
app.get('/test'...
模拟了一个会抛出错误的路由处理函数。 - 错误处理中间件:
app.use((err, req, res, next) => {...
是错误处理中间件。它根据错误类型设置statusCode
和errorMessage
,并通过res.status(statusCode).json({ error: errorMessage });
返回给客户端合适的HTTP状态码和错误信息。
这样设计的错误处理中间件既能够有效地捕获不同路由处理函数抛出的错误,又能根据错误类型返回合适的HTTP状态码和错误信息,同时保持了较好的性能和可维护性。