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

Node.js自定义ErrorResponse不接收错误码参数返回500而非401问题

问题修复方案

核心问题原因

  1. 错误处理中间件属性名不匹配:自定义错误类定义的状态码字段为statusCode,但中间件返回时读取的是不存在的status字段,无匹配值时默认返回500
  2. 错误处理中间件注册位置错误:Express要求错误处理中间件必须注册在所有路由之后、服务启动之前,当前代码中app.use(errorHandler)放在了server.listen之后,无法捕获路由抛出的错误
  3. 中间件内部变量赋值错误:处理ValidationError时将新生成的错误实例赋值给了err变量,但后续返回时使用的是error变量,导致该逻辑不生效
  4. 浅复制Error实例丢失属性:使用{...err}浅复制原生Error实例时,无法复制原型链上的自定义属性

修复步骤

1. 修复middlewares/error.js错误处理中间件

// 注意补全你自己的自定义错误类引入路径
const ErrorResponse = require('../utils/errorResponse'); 

const errorHandler = (err, req, res, next) =>{
    // 直接复用原错误实例,避免浅复制丢失属性
    let error = err;

    if(err.code === 11000) {
        const message = `重复键错误`;
        error = new ErrorResponse(message, 400)
    }

    if(err.name === "ValidationError") {
        const message = Object.values(err.errors).map((val) => val.message).join(',');
        // 修正赋值对象为error
        error = new ErrorResponse(message, 400)
    }
    // 修正属性名为statusCode,修正succes拼写为success
    res.status(error.statusCode || 500 ).json({
        success: false,
        error: error.message || "服务器错误"
    })
}

module.exports = errorHandler;

2. 修正server.js中间件注册顺序

require('dotenv').config({path: './config.env'});
const express = require('express');
const connectDB = require('./config/db');
const errorHandler = require('./middlewares/error');

connectDB();

const app = express();

app.use(express.json());
app.use('/api/auth', require('./routes/auth'));
app.use('/api/private', require('./routes/private'));
// 错误处理中间件移到所有路由之后、listen之前
app.use(errorHandler);

const PORT = process.env.PORT || 5000;

const server = app.listen(PORT, () => console.log('server on port', PORT));

process.on("unhandledRejection", (err, promise) => {
    console.log(`logged Error: ${err}`)
    server.close(() => process.exit(1))
});

验证

修复完成后重启服务,再次触发auth.js中的return next(new ErrorResponse('Unauthorized', 401))逻辑,即可正常返回401状态码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:27:03