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

NODE_ENV为production时全局错误处理中间件未返回错误的问题

问题:Node.js生产环境下全局错误处理中间件无法返回错误给客户端

我正在学习Jonas的Node.js课程,遇到一个技术问题:development模式下,错误会被正常记录并返回给客户端(比如Postman);但设置NODE_ENV为production模式时,错误无法返回给客户端。

全局错误处理中间件代码

module.exports = (err, req, res, next) => {
  err.statusCode = err.statusCode || 500;
  err.status = err.status || 'error';

  if (process.env.NODE_ENV === 'development') {
    sendErrorDev(err, res);
  }
  if (process.env.NODE_ENV === 'production') {
    // let error = { ...err };
    // if (error.name === 'CastError') error = handleCastErrorDB(error);

    sendErrorDev(err, res);
  }
};

sendErrorDev() 函数代码

const sendErrorDev = (err, res) => {
  res.status(err.statusCode).json({
    status: err.status,
    // error: err,
    message: err.message,
    // stack: err.stack,
  });

问题排查与修复建议

  • 先确认环境变量是否生效
    在全局错误处理中间件的最顶部加一行日志,打印当前环境变量值,确认production模式下process.env.NODE_ENV确实是'production':

    console.log('当前运行环境:', process.env.NODE_ENV);
    

    很多时候环境变量加载失败(比如dotenv配置错误),会导致生产环境的代码分支根本没执行。

  • 修复sendErrorDev的语法错误
    你贴的sendErrorDev函数缺少闭合的大括号,这会直接导致语法错误,生产环境下服务器遇到语法错误会崩溃,自然无法返回响应。补全函数末尾的};:

    const sendErrorDev = (err, res) => {
      res.status(err.statusCode).json({
        status: err.status,
        // error: err,
        message: err.message,
        // stack: err.stack,
      });
    };
    
  • 完善生产环境的错误对象处理
    你注释掉了错误对象的复制和特定错误类型的处理代码,直接传递原始err对象可能存在问题——生产环境下有些错误对象的属性可能被隐藏或无法被解构。取消注释并补充必要的属性传递:

    if (process.env.NODE_ENV === 'production') {
      let error = { ...err };
      error.message = err.message; // 确保message属性被正确复制
      error.statusCode = err.statusCode;
      error.status = err.status;
      if (error.name === 'CastError') error = handleCastErrorDB(error);
    
      sendErrorDev(error, res);
    }
    
  • 检查是否有其他中间件拦截错误
    确保全局错误处理中间件是你所有路由和中间件的最后一个,否则前面的中间件如果提前处理了错误并结束响应,这个全局中间件就不会被触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:12:55