如何在AWS Lambda中从Promise返回自定义JSON(Node.js+DynamoDB)
问题分析与修复方案
我一眼就看出了问题所在——你当前的代码虽然在then回调里构建了自定义响应,但函数最后返回的是原始的DynamoDB扫描Promise结果,而不是你处理后的响应。加上代码里还有几个语法和逻辑小问题,导致返回结果不符合预期。
具体问题点:
- 返回值错误:你在
queryParams.then()里返回了自定义response,但这个返回值只属于回调函数,不会改变paramQuery函数的返回值。函数最后return queryParams,直接返回了DynamoDB扫描的原始Promise结果,这就是为什么你拿到的是Items、Count这些原始字段。 - 语法错误:
params对象里的TableName: process.env.TABLE_NAME;用了分号,应该改成逗号(如果后续有其他参数)或者直接去掉分号。 - 无效递归:开头那句
const paramQuery = async () => { return await paramQuery(); }是无限递归调用,会直接导致栈溢出,必须删掉。 - Lambda响应格式问题:Lambda要求返回的
body必须是字符串,你原来的代码直接返回data.Items(对象数组),虽然Lambda会自动序列化,但显式用JSON.stringify更稳妥。
修复后的代码(用async/await简化逻辑)
因为你希望避免显式调用resolve/reject,用async/await是最适合的方案,代码更简洁易读:
// 先删掉开头的无效递归定义 const paramQuery = async () => { try { // 修正语法错误,构建扫描参数 const params = { TableName: process.env.TABLE_NAME }; // 用await直接获取扫描结果,替代then回调 const scanResult = await documentClient.scan(params).promise(); // 构建符合要求的自定义响应 const customResponse = { statusCode: 200, body: JSON.stringify(scanResult.Items) // 转成字符串符合Lambda要求 }; // 返回自定义响应,async函数会自动包装成Promise return customResponse; } catch (error) { console.error("扫描DynamoDB出错:", error); // 错误场景返回自定义错误响应 return { statusCode: 500, body: JSON.stringify({ error: error.message }) }; } }; // 在Lambda handler里正确调用 exports.handler = async (event) => { // 这里可以根据event处理用户输入,调整params(如果需要的话) const response = await paramQuery(); return response; };
为什么这样改能解决问题?
- 用
await等待DynamoDB扫描Promise完成,直接拿到结果,避免了回调嵌套,确保我们能在拿到结果后构建自定义响应。 paramQuery函数的返回值就是我们构建的customResponse,而不是原始的扫描Promise,Lambda handler调用后就能返回你想要的结构。- 加上
try/catch捕获扫描过程中的错误,返回友好的错误状态码和信息,让API更健壮。
这样调整后,你就能得到期望的响应格式了:
{ "statusCode": 200, "body": "[{\"ParameterName\":\"Name\",\"ParameterValue\":\"Value\"},{\"ParameterName\":\"Name\",\"ParameterValue\":\"Value\"}]" }
如果不需要body是字符串(比如某些自定义运行环境),可以去掉JSON.stringify,但Lambda环境下建议保留。
内容的提问来源于stack exchange,提问作者sebaaloc
相关产品推荐
相关产品推荐

