使用PG Promise执行SELECT查询后,data.id为undefined但data含id数组问题
问题排查与解决
嘿,我一眼就揪出问题所在啦!
核心原因
你用的db.any()方法,不管查询结果是1条还是多条,它都会把结果包装成数组返回。你打印的data是[ anonymous { id: 23, username: 'vvv', ... } ],这明显是一个包含单个对象的数组——数组本身并没有id属性,id是数组里那个匿名对象的属性,所以直接访问data.id自然会得到undefined。
解决方案
根据你的业务场景,有两种靠谱的修复方式:
方式一:用适合单条结果的查询方法(推荐)
因为你是按username查询理发师,通常用户名是唯一的,所以应该用db.one()或db.oneOrNone(),它们会直接返回单个对象,而不是数组:
app.post('/api/hairdresser/signin', (req, res) => { console.log(req.body) // 小提醒:PG Promise会自动管理连接池,不需要手动调用connection.connect(),这行可以删掉 var name = req.body.name; var password = req.body.password; db.one('SELECT * FROM hairdressers where username = $1 ', name) .then(function(data) { console.log(data); console.log(data.id); // 现在就能正常拿到23啦 }) .catch(function(error) { console.log(error); }); })
db.one():如果查询不到结果,会直接抛出错误,适合你确定用户名一定存在的场景db.oneOrNone():如果查询不到结果,会返回null,更安全,适合需要处理“用户不存在”情况的场景
方式二:继续用db.any(),但访问数组元素
如果你坚持要用db.any(),那就得通过数组索引去访问里面的对象:
app.post('/api/hairdresser/signin', (req, res) => { console.log(req.body) var name = req.body.name; var password = req.body.password; db.any('SELECT * FROM hairdressers where username = $1 ', name) .then(function(data) { console.log(data); if(data.length > 0) { console.log(data[0].id); // 取数组第一个元素的id } else { console.log('未找到匹配的理发师'); } }) .catch(function(error) { console.log(error); }); })
额外小优化
你的代码里有一行connection.connect();,其实PG Promise已经内置了连接池管理,会自动处理连接的创建和释放,这行代码完全可以删掉,避免多余的连接操作哦~
内容的提问来源于stack exchange,提问作者jadlmir
相关产品推荐
相关产品推荐

