如何在DynamoDB返回空响应时返回错误状态码?
解决方案
一、状态码选择:优先用404
当请求的目标资源(即DynamoDB中对应指定id的条目)不存在时,返回404 Not Found是符合REST规范的。204 No Content适用于请求成功但确实无内容返回的场景(比如删除资源成功后无需返回数据),但资源不存在属于客户端请求的资源本身不存在,用404更贴合语义。
二、更优雅的实现方式
DynamoDB的get操作返回的响应对象中,仅当查询到有效数据时才会包含Item字段;未查询到数据时,Item属性为undefined。直接检查这个字段比遍历对象键更准确高效——因为响应里默认会包含ResponseMetadata等系统字段,用Object.keys(body).length判断容易出现误判。
优化后的代码示例:
export const handler: Handler = async (event, context) => { let body; let statusCode = 200; const headers = { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token", "Content-Type": "application/json", }; try { const response = await dynamo .get({ TableName: "Table", Key: { id: event.pathParameters.id, }, }) .promise(); // 直接判断Item是否存在 if (!response.Item) { statusCode = 404; body = { message: "指定的资源不存在" }; } else { body = response.Item; } } catch (err: any) { statusCode = 400; body = { message: err.message }; } finally { body = JSON.stringify(body); } return { statusCode, body, headers, }; };
三、关于DynamoDB不抛出错误的说明
这是DynamoDB的设计预期:查询不存在的键不属于异常场景,只是查询结果为空,因此不会主动抛出错误,需要开发者自行判断结果并做对应处理。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

