AWS Node.js Lambda Promise reject无法返回自定义错误 resolve运行正常
问题成因
AWS Lambda 针对 async 类型的 handler 有明确的处理规则:
- 当函数正常
return一个值,或 Promise 状态变为resolved时,Lambda 会将返回/resolve的内容直接传递给 API Gateway - 当函数抛出未捕获的异常,或 Promise 状态变为
rejected时,Lambda 会将此次调用判定为执行异常,无论你传入reject的内容是什么,都会被Lambda统一包装成错误格式返回,不符合 LAMBDA_PROXY 集成要求的标准响应结构,API Gateway 无法解析就会返回 502 内部服务错误。
LAMBDA_PROXY 集成要求Lambda必须返回包含statusCode、body等字段的标准对象,且该对象必须是函数成功执行后的返回值,不能是异常抛出/reject的内容。
解决方案
不要用 reject 来返回业务层面的错误响应,直接将需要返回的403响应对象通过 resolve 传递即可,所有符合格式要求的响应都走成功返回流程即可。
修改后的参考代码:
exports.handler = async function (event, context) { if (event.body.myParam === '1') { // 运行正常 return { statusCode: 302, headers: { Location: 'https://iam.aredire.ct' } }; } else if (event.body.myParam === '2') { // 运行正常,返回403 - {"message":"You are not allowed to do that!"} return { statusCode: 403, body: JSON.stringify({ message: 'You are not allowed to do that!' }) }; } else if (event.body.myParam === '3') { const jwt = require('jsonwebtoken'); const token = 'ey...'; const pubKey = '-----BEGIN PUBLIC KEY----- ...'; // 测试Promise return new Promise(function (resolve, reject) { // 异步调用 jwt.verify(token, pubKey, function (err, decoded) { if (err) { // 错误可正常打印到日志 console.log(err); // 直接resolve 403响应对象即可正常返回 return resolve({ statusCode: 403, body: JSON.stringify({ message: 'No valid token' }) }); } // 运行正常,返回200 - {"message":"Works!"} resolve({ statusCode: 200, body: JSON.stringify({ message: 'Works!' }) }); }); }); } }
如果需要捕获全局运行异常,可以在外层包裹try/catch,catch逻辑中直接返回对应的错误响应即可:
exports.handler = async function (event, context) { try { // 原有业务逻辑 } catch (e) { console.error(e); return { statusCode: 500, body: JSON.stringify({message: '服务内部错误'}) } } }
注意:不推荐通过配置API Gateway错误映射来适配reject的返回,这种方案维护成本高,且不符合LAMBDA_PROXY集成的设计逻辑,所有业务响应都走成功返回流程即可。
内容的提问来源于stack exchange,提问作者Cologne_Muc
相关产品推荐
相关产品推荐

