MST

星途 面试题库

面试题:Node.js HTTP服务中如何实现优雅的错误处理中间件

请描述如何在Node.js的HTTP服务中设计并实现一个错误处理中间件,该中间件要能够捕获不同路由处理函数中抛出的错误,并根据错误类型返回合适的HTTP状态码和错误信息,同时还要考虑性能和可维护性。请给出关键代码示例及简要说明。
40.0万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

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. 代码说明

  • 错误类型定义:定义了BadRequestErrorInternalServerError两个自定义错误类,每个类都有自己的statusCode
  • 路由处理函数app.get('/test'... 模拟了一个会抛出错误的路由处理函数。
  • 错误处理中间件app.use((err, req, res, next) => {... 是错误处理中间件。它根据错误类型设置statusCodeerrorMessage,并通过res.status(statusCode).json({ error: errorMessage }); 返回给客户端合适的HTTP状态码和错误信息。

这样设计的错误处理中间件既能够有效地捕获不同路由处理函数抛出的错误,又能根据错误类型返回合适的HTTP状态码和错误信息,同时保持了较好的性能和可维护性。