Express Node.js错误中间件返回HTML而非JSON的问题求助
问题解决:Express错误中间件返回HTML而非JSON
问题原因
- Express内置默认错误处理逻辑,在未明确指定响应格式时会返回HTML页面。
- 错误中间件挂载顺序错误,未放在所有路由和其他中间件之后,导致未正确捕获未匹配的路由请求。
- 未在错误处理流程中明确设置响应的
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
相关产品推荐
相关产品推荐

