You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:36:11