AWS RDS Postgres查询仅返回首条记录问题求助
问题排查与修复
核心问题分析
1. 查询参数类型不匹配
event.queryStringParameters返回的所有参数都是字符串类型,但PostgreSQL的LIMIT和OFFSET要求传入整数。直接将字符串传入查询,会导致数据库解析异常:要么强制转换后不符合预期(比如LIMIT '1'只会返回1条),要么直接触发语法错误。
2. Cursor使用不规范
你使用pg-cursor的cursor.read(100)仅读取了一次最多100条数据,没有循环读取直到返回空数组,这会导致数据量超过100条时漏读;同时,从连接池获取的client未调用client.release()释放,会造成连接池耗尽,后续请求无法获取数据库连接。
3. 缺失参数默认值
如果请求未携带order_status、limit或offset参数,event.queryStringParameters对应的字段会是undefined,直接传入查询会触发数据库参数错误。
修复后的查询代码
const pool = require('./pgConnection') const Cursor = require('pg-cursor') module.exports = async (event) => { let client; try { // 处理参数:设置默认值并转换为正确类型 const orderStatus = event.queryStringParameters?.order_status || 'created'; const limit = parseInt(event.queryStringParameters?.limit) || 10; const offset = parseInt(event.queryStringParameters?.offset) || 0; // 校验参数合法性 if (isNaN(limit) || isNaN(offset) || limit <= 0 || offset < 0) { return { statusCode: 400, body: JSON.stringify({ error: 'Invalid limit or offset value' }) }; } const query = 'SELECT * FROM orders WHERE current_status = $1 LIMIT $2 OFFSET $3'; const values = [orderStatus, limit, offset]; client = await pool.connect(); const cursor = client.query(new Cursor(query, values)); let rows = []; let chunk; // 循环读取所有数据直到cursor返回空数组 while ((chunk = await cursor.read(100)).length > 0) { rows = rows.concat(chunk); } return { statusCode: 200, body: JSON.stringify(rows) }; } catch (err) { console.error(err.message); return { statusCode: 500, body: JSON.stringify({ error: err.message }) }; } finally { // 确保连接被释放回池 if (client) { client.release(); } } }
额外优化建议(创建记录代码)
你的创建记录代码每次请求都会执行createTable(),虽然用了IF NOT EXISTS,但频繁执行DDL操作会影响性能,建议将表结构初始化逻辑移出Lambda函数,改为通过Serverless资源配置(如CloudFormation)或手动执行一次。
内容的提问来源于stack exchange,提问作者Salvatore
相关产品推荐
相关产品推荐

