You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express中调用next(error)无法触发错误中间件问题

问题描述

使用Express框架时,调用next(errorObj)无法触发自定义错误处理中间件。预期错误发生时返回包含status和message的JSON响应,但实际返回默认HTML错误页面。

相关代码

app.ts

// ... routes
// Route middleware
app.use('/auth', authRouter)

// Error middleware
app.use(errorHandler)

controllers/authController.ts

export const register = async (
  req: Request,
  res: Response,
  next: NextFunction,
) => {
  try {
    throw new Error(
      `Email or username is already exists. Please try again with different one.`,
    )
  } catch (error) {
    next(error)
  }
}

middleware/errorHandler.ts

const errorHandler = (error: Error, req: Request, res: Response) => {
  const statusCode = res.statusCode || 500
  const responseBody: ErrorResponse = {
    status: statusCode,
    message: error.message || 'Internal Server Error',
  }

  res.status(statusCode).json(responseBody)
}

export default errorHandler

当前错误响应

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>Error</title>
</head>

<body>
    <pre>Error: Email or username is already exists. Please try again with different one.<br> &nbsp; &nbsp;at register (/Users/musab/Documents/Projects/winner-vpn/backend/src/controllers/authController.ts:21:13)<br> &nbsp; &nbsp;at processTicksAndRejections (node:internal/process/task_queues:95:5)</pre>
</body>

</html>
问题原因与解决方案

核心原因

Express的错误处理中间件必须包含4个参数:error, req, res, next。你的errorHandler只定义了3个参数,导致Express无法识别它为错误处理中间件,转而使用默认逻辑返回HTML页面。

修复步骤

修改middleware/errorHandler.ts,添加next参数(即使不需要使用,也必须声明):

import { Request, Response, NextFunction } from 'express';

interface ErrorResponse {
  status: number;
  message: string;
}

const errorHandler = (error: Error, req: Request, res: Response, next: NextFunction) => {
  const statusCode = res.statusCode || 500;
  const responseBody: ErrorResponse = {
    status: statusCode,
    message: error.message || 'Internal Server Error',
  };

  res.status(statusCode).json(responseBody);
};

export default errorHandler;

额外检查项

  1. 确保错误处理中间件放在所有路由和其他中间件之后,你的app.ts中已将app.use(errorHandler)放在authRouter之后,这部分逻辑正确。
  2. 异步请求处理函数需用try/catch捕获异常并通过next(error)传递,你的register控制器已实现该逻辑,无需修改。

内容的提问来源于stack exchange,提问作者Musab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:28:15