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

