部署AWS Lambda REST接口遇Malformed Lambda proxy response错误求助
你遇到的Malformed Lambda proxy response错误,核心原因是你的Lambda函数没有返回API Gateway代理集成要求的正确格式响应,而直接诱因是你错误地把同步方法当作Promise来调用。
具体问题点
同步方法误用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代理集成的格式要求。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




