You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
注册

部署AWS Lambda REST接口遇Malformed Lambda proxy response错误求助

问题分析与解决方案

你遇到的Malformed Lambda proxy response错误,核心原因是你的Lambda函数没有返回API Gateway代理集成要求的正确格式响应,而直接诱因是你错误地把同步方法当作Promise来调用。

具体问题点

  1. 同步方法误用Promise链式调用
    你的NamingService.generateName()是同步返回字符串的方法,但在Lambda handler里却用了.then()链式调用:

    namingService.generateName()
      .then(name => { callback(null, responses.success(name)) })
      .catch(error => { callback(null, responses.error(error)) })
    

    字符串本身没有.then()方法,这会立即抛出同步TypeError,而这个错误不会被Promise的.catch()捕获(因为.catch()只处理Promise链内的异步错误)。此时Lambda会因未捕获的异常终止,返回的内容不是你预期的响应对象,而是直接返回了generateName()的字符串结果,这完全不符合API Gateway代理集成的格式要求。

  2. API Gateway代理集成的硬性格式要求
    使用API Gateway的Lambda代理集成时,Lambda必须返回包含以下字段的对象:

    • statusCode: 合法的HTTP状态码
    • headers: 响应头(需包含你配置的CORS相关项)
    • body: 序列化后的JSON字符串

修复方案

你可以任选以下两种方式修复:

方案1:同步调用+try-catch处理错误

修改Lambda handler代码,直接同步调用generateName(),并用try-catch捕获可能的错误:

module.exports = {
 generateName: (event, context, callback) => {
   context.callbackWaitsForEmptyEventLoop = false;
   const namingService = new NamingService();
   try {
     const name = namingService.generateName();
     callback(null, responses.success(name));
   } catch (error) {
     callback(null, responses.error(error));
   }
 }
};

方案2:将generateName改为返回Promise

修改NamingService.js,让generateName()返回一个Promise,这样原来的链式调用就能正常工作(后续也方便替换为真正的异步生成逻辑):

// NamingService.js
class NamingService {
 generateName() {
   return Promise.resolve('generated-name');
 }
}
module.exports = NamingService;

验证修复

修改后重新执行serverless deploy,再测试API Gateway接口,就能正常返回符合格式的响应,不会再出现Malformed Lambda proxy response错误。

内容的提问来源于stack exchange,提问作者lapots

火山引擎 最新活动