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

使用Express错误中间件时Nginx返回502的问题求助

问题根源分析

  1. 错误处理中间件顺序错误:Express中间件按注册顺序执行,你把errorHandler放在路由之前,导致路由抛出的错误无法被该中间件捕获。
  2. Async函数错误未被Express处理:你的路由处理函数是async函数,抛出的错误会转化为Promise的rejection,Express默认不会将这类rejection传递给错误处理中间件,导致请求挂起无响应,最终Nginx返回502网关错误。

修复步骤

1. 调整错误处理中间件的位置

修改index.ts,将错误处理中间件移到所有路由之后,确保它能捕获后续路由抛出的错误:

import express from 'express';
import signupRouter from './routes/signup';
import { errorHandler } from './middlewares/error-handler';

const app = express();
app.use(express.json());

// 先注册所有路由
app.use(signupRouter);

// 最后注册错误处理中间件
app.use(errorHandler);

app.listen(3000, () => console.log('Auth service listening on port 3000'));

2. 处理Async函数中的错误

有两种方案解决async函数的错误捕获问题:

方案一:手动用try/catch包裹并传递错误给next

修改signup.ts的路由处理函数,添加next参数并在catch中传递错误:

async (req: Request, res: Response, next: NextFunction) => {
  try {
    const errors = validationResult(req);
    if (!errors.isEmpty()) throw new Error('Invalid email or password');
    res.send({});
  } catch (err) {
    // 将错误传递给错误处理中间件
    next(err);
  }
}

方案二:使用工具包自动处理async错误

安装express-async-errors包,它会自动修补Express对async函数错误的处理逻辑:

npm install express-async-errors

在index.ts顶部导入该包(无需额外调用,包会自动生效):

import 'express-async-errors';
import express from 'express';
// ... 其他导入代码

之后你的async函数中抛出的错误会自动被Express传递给错误处理中间件,无需手动写try/catch。

3. 验证修复效果

重新运行skaffold dev,用Postman发送错误请求:

  • 终端会打印hiii(错误处理中间件的日志)
  • Postman会收到400状态码和标准化的JSON错误响应,不再返回502。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:25:33