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

如何修复Node+MongoDB注册用户时的ERR_HTTP_INVALID_STATUS_CODE错误

注册新用户时触发RangeError: Invalid status code: undefined错误(MERN栈电商项目)

问题描述

开发MERN栈电商网站,注册新用户时出现以下错误:

RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: undefined

错误定位到middleware/error.js文件的响应语句处。

相关代码

错误中间件(middleware/error.js)

module.exports = (err, req, res, next) => {
  err.statusCode = err.statusCode || 500;
  err.message = err.message || "Internal Server Error";
  
  res.status(err.statusCode).json({
    success: false,
    message: err.message,
  });
};

主应用文件(app.js)

const express = require("express");
const app = express();
const cookieParser = require("cookie-parser");
const bodyParser = require("body-parser");
const fileUpload = require("express-fileupload");

const errorMiddleware = require("./middleware/error");

app.use(express.json());
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(fileUpload());

// Route Imports
const product = require("./routes/productRoute");
const user = require("./routes/userRoute");
const order = require("./routes/orderRoute");

app.use("/api/v1", product);
app.use("/api/v1", user);
app.use("/api/v1", order);

// Middleware for Errors 
app.use(errorMiddleware);
  
module.exports = app;

后端完整报错信息

Ranjeet@Home MINGW64 ~/Desktop/projects/ecommerce/backend
$ npm run dev

> mernecommerce@1.0.0 dev
> nodemon backend/server.js

[nodemon] 2.0.16
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node backend/server.js`
Server is working on http://localhost:4000
Mongodb connected with server: localhost
RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: undefined
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.writeHead (node:_http_server:274:11)
    at ServerResponse._implicitHeader (node:_http_server:265:8)
    at write_ (node:_http_outgoing:766:9)
    at ServerResponse.end (node:_http_outgoing:855:5)
    at ServerResponse.send (C:\Users\Ranjeet\Desktop\projects\ecommerce\node_modules\express\lib\response.js:221:10)
    at ServerResponse.json (C:\Users\Ranjeet\Desktop\projects\ecommerce\node_modules\express\lib\response.js:267:15)
    at module.exports (C:\Users\Ranjeet\Desktop\projects\ecommerce\backend\middleware\error.js:33:30)

问题原因

  1. 错误传递异常:用户注册路由中的异步错误未被正确捕获,导致传递给错误中间件的err对象无效(甚至为undefined),使得err.statusCode无法被赋值为兜底的500。
  2. 中间件逻辑缺陷:直接修改err对象属性,若err是不可修改的冻结对象或undefined,会导致statusCode赋值失败。

解决方案

1. 修复错误中间件逻辑

修改middleware/error.js,使用独立变量存储状态码和消息,同时用可选链处理err可能不存在的情况:

module.exports = (err, req, res, next) => {
  const statusCode = err?.statusCode || 500;
  const message = err?.message || "Internal Server Error";
  
  res.status(statusCode).json({
    success: false,
    message: message,
  });
};

2. 确保路由错误被正确捕获传递

在用户注册路由(userRoute.js)中,用try/catch包裹异步逻辑,将错误通过next(err)传递给中间件:

router.post("/register", async (req, res, next) => {
  try {
    const { name, email, password } = req.body;
    
    // 检查用户是否已存在
    const existingUser = await User.findOne({ email });
    if (existingUser) {
      const error = new Error("该邮箱已注册");
      error.statusCode = 400;
      throw error;
    }

    // 其他注册逻辑:哈希密码、创建用户等
    // ...

    res.status(201).json({
      success: true,
      message: "注册成功"
    });
  } catch (err) {
    next(err);
  }
});

3. 全局捕获未处理的异步错误

在app.js中添加全局事件监听,捕获未处理的Promise拒绝和异常:

// 在错误中间件之前添加
process.on('unhandledRejection', (err) => {
  console.error('未处理的Promise拒绝:', err);
  throw err;
});

process.on('uncaughtException', (err) => {
  console.error('未捕获的异常:', err);
  process.exit(1);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:06:33