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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:00:05