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

Express Node.js错误中间件返回HTML而非JSON的问题求助

问题解决:Express错误中间件返回HTML而非JSON

问题原因

  1. Express内置默认错误处理逻辑,在未明确指定响应格式时会返回HTML页面。
  2. 错误中间件挂载顺序错误,未放在所有路由和其他中间件之后,导致未正确捕获未匹配的路由请求。
  3. 未在错误处理流程中明确设置响应的Content-Type为application/json。

解决方案

1. 修改notFound中间件,明确指定响应格式

在创建错误并设置状态码后,添加Content-Type头,确保后续响应以JSON格式返回:

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

const notFound = (req: Request, res: Response, next: NextFunction) => {
  const error = new Error(`Not Found - ${req.originalUrl}`);
  // 设置状态码并指定响应格式为JSON
  res.status(404).setHeader('Content-Type', 'application/json');
  next(error);
};

2. 优化errorHandler中间件,移除重复调用

合并重复的状态码设置逻辑,避免潜在的响应状态覆盖问题:

const errorHandler = (err: Error, req: Request, res: Response) => {
  const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
  const errorResponse =
    process.env.NODE_ENV === 'production'
      ? { message: err.message }
      : {
          message: err.message,
          stack: err.stack
        };
  // 合并状态码设置与JSON响应
  res.status(statusCode).json(errorResponse);
};

export { notFound, errorHandler };

3. 调整中间件挂载顺序

必须将notFound和errorHandler放在所有路由、静态文件中间件之后,确保只有当所有路由都未匹配时才触发404逻辑:

import express from 'express';
import { errorHandler, notFound } from './middleware/errorMiddleware';
import yourRouter from './routes/yourRouter';

const app = express();

// 先挂载请求解析中间件
app.use(express.json());
// 挂载业务路由
app.use('/api', yourRouter);
// 挂载静态文件服务(如果有)
app.use(express.static('public'));
// 最后挂载错误处理中间件
app.use(notFound);
app.use(errorHandler);

app.listen(3000, () => console.log('Server running on port 3000'));

验证

发起未匹配路由的请求后,响应头会包含Content-Type: application/json,响应体将呈现预期的JSON格式错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:43:18