Node.js自定义ErrorResponse不接收错误码参数返回500而非401问题
问题修复方案
核心问题原因
- 错误处理中间件属性名不匹配:自定义错误类定义的状态码字段为
statusCode,但中间件返回时读取的是不存在的status字段,无匹配值时默认返回500 - 错误处理中间件注册位置错误:Express要求错误处理中间件必须注册在所有路由之后、服务启动之前,当前代码中
app.use(errorHandler)放在了server.listen之后,无法捕获路由抛出的错误 - 中间件内部变量赋值错误:处理
ValidationError时将新生成的错误实例赋值给了err变量,但后续返回时使用的是error变量,导致该逻辑不生效 - 浅复制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
相关产品推荐
相关产品推荐

