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

在Lambda中返回Promise时如何向API Gateway返回HTTP状态码?

如何在返回Promise的Lambda函数中向API Gateway返回不同HTTP状态码

嘿,这个问题我熟!API Gateway需要Lambda返回特定格式的响应对象才能正确映射HTTP状态码,而不是简单返回字符串或错误信息。不管你是resolve成功结果还是reject错误,都得把内容包装成符合要求的结构。

核心要点:API Gateway期望的响应格式

Lambda返回的对象必须包含以下关键字段:

  • statusCode: 要返回的HTTP状态码(比如200、400、500)
  • headers: 可选但常用,比如设置CORS头(Access-Control-Allow-Origin等)
  • body: 响应的内容,必须是JSON字符串(用JSON.stringify()转换)

修改你的代码示例

下面是调整后的版本,分别处理成功返回200、错误返回500的情况:

const http = require('http');

exports.handler = async (event, context) => {
  return new Promise((resolve, reject) => {
    const options = { 
      // 你的请求配置,比如hostname、method、path等
    };

    const req = http.request(options, (res) => {
      let responseBody = '';
      res.on('data', (chunk) => {
        responseBody += chunk;
      });
      res.on('end', () => {
        // 成功时返回200状态码
        resolve({
          statusCode: 200,
          headers: {
            'Access-Control-Allow-Origin': '*', // 处理CORS,根据需求调整
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({
            message: 'Success',
            data: responseBody
          })
        });
      });
    });

    req.on('error', (e) => {
      // 错误时返回500(或其他合适的状态码,比如400如果是参数错误)
      reject({
        statusCode: 500,
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          error: e.message
        })
      });
    });

    req.write('');
    req.end();
  })
  .catch(error => {
    // 确保reject的错误也能被正确返回给API Gateway
    return error;
  });
};

额外优化:用async/await简化代码

因为你的handler已经标记为async,其实可以把http.request包装成Promise,然后用await来写,代码会更清晰:

const http = require('http');

// 把http.request包装成Promise
const httpRequest = (options, postData) => {
  return new Promise((resolve, reject) => {
    const req = http.request(options, (res) => {
      let body = '';
      res.on('data', chunk => body += chunk);
      res.on('end', () => resolve({ statusCode: res.statusCode, body }));
    });
    req.on('error', reject);
    if (postData) req.write(postData);
    req.end();
  });
};

exports.handler = async (event, context) => {
  try {
    const options = { /* 你的配置 */ };
    const response = await httpRequest(options, '');
    
    // 根据http请求的响应状态码,返回对应的API Gateway响应
    return {
      statusCode: response.statusCode,
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        message: 'Request completed',
        data: response.body
      })
    };
  } catch (e) {
    // 捕获错误,返回500或其他合适的状态码
    return {
      statusCode: 500,
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ error: e.message })
    };
  }
};

注意事项

  • 如果需要返回其他状态码(比如400表示客户端参数错误、404表示资源不存在),只需要在对应的分支修改statusCode的值即可。
  • headers里的CORS配置要根据你的实际需求调整,比如限制特定域名而不是*。
  • body必须是JSON字符串,不能直接传对象,否则API Gateway会返回502错误。

内容的提问来源于stack exchange,提问作者Joey Yi Zhao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:39:12