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
相关产品推荐
相关产品推荐

