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

NestJS GraphQL网关中Express JWT错误处理方案问询

在NestJS GraphQL网关中统一处理Express JWT错误返回

解决方案实现

1. 调整中间件顺序与错误处理逻辑

Express的错误处理中间件必须放在所有业务中间件(包括express-jwt)之后才能捕获到对应错误。以下是调整后的完整代码:

// 先配置GraphQL上传与JWT验证中间件
app.use(
  graphqlUploadExpress(),
  expressJwt({
    secret: secretCallback,
    algorithms: ['HS256'],
    credentialsRequired: false,
  }),
);

// 紧接着添加JWT错误处理中间件
app.use((err, req, res, next) => {
  const { ip, method, originalUrl, headers } = req;
  const requestMeta = { headers, ip, method, originalUrl, error: err };

  // 捕获所有express-jwt抛出的未授权错误
  if (err.name === 'UnauthorizedError') {
    // 按错误类型记录差异化日志
    if (err.message === 'jwt expired') {
      Logger.error('Gateway JWT Expired', requestMeta);
    } else if (err.code === 'invalid_token') {
      Logger.error('Gateway JWT Invalid', requestMeta);
    }
    // 统一返回指定格式的错误响应
    return res.status(err.status).send({ message: err.message });
  }

  // 非JWT错误交给后续中间件处理
  next(err);
});

2. GraphQL规范响应适配(可选)

如果你的客户端期望标准GraphQL错误格式,可将响应包装为GraphQL规范结构:

return res.status(err.status).json({
  errors: [
    {
      message: err.message,
      extensions: {
        code: err.code || 'UNAUTHORIZED',
        status: err.status,
      },
    },
  ],
  data: null,
});

关键说明

  • err.name === 'UnauthorizedError'是express-jwt抛出错误的统一标识,所有JWT相关错误都会命中该判断
  • express-jwt抛出的错误对象内置了status(默认401)和message字段,可直接复用
  • 保留了原有的差异化日志逻辑,便于问题排查

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:20:29