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

Node.js中使用async/await执行MySQL查询失败求助

解决async/await调用MySQL查询时的循环结构JSON错误

这个问题我之前也踩过坑!核心原因是你用await调用connection.query()时,拿到的返回值和回调模式里的完全不一样——它返回的是一个包含两个元素的数组:[查询结果集, 字段信息对象],而字段信息对象里存在循环引用(比如它关联了数据库连接对象,连接对象又反向引用了它),当Express自动把这个数组转为JSON时,JSON.stringify()就会抛出循环结构的错误。而回调模式下,你应该是只用到了第一个参数(结果集),所以没触发这个问题。

给你几个可行的解决方案:

方案1:解构获取结果集(最常用)

直接从返回的数组里提取出结果集,忽略字段信息(如果不需要的话):

router.get("/getuser", async(req,res)=>{ 
  const emailexists= 'select * from users' 
  try{ 
    // 解构出结果数组,fields是字段信息,这里我们不需要它
    const [results] = await connection.query(emailexists) 
    res.send(results) 
  }catch(err){ 
    console.log(err)
    // 记得给前端返回错误状态码
    res.status(500).send({ error: err.message })
  } 
})

方案2:如果需要字段信息,手动处理循环引用

如果你确实需要用到字段信息,不能直接返回整个fields对象,得先处理掉循环引用的部分,比如用Node.js内置的util.inspect把它转为字符串,或者只提取你需要的字段:

const util = require('util');

router.get("/getuser", async(req,res)=>{ 
  const emailexists= 'select * from users' 
  try{ 
    const [results, fields] = await connection.query(emailexists) 
    res.send({
      data: results,
      // 把fields转为可序列化的字符串,depth: null表示完整展示
      fields: util.inspect(fields, { depth: null })
    })
  }catch(err){ 
    console.log(err)
    res.status(500).send({ error: err.message })
  } 
})

额外提醒

如果你用的是mysql2库的Promise API,原理也是一样的——它的query方法返回的Promise也是resolve出[rows, fields]数组,所以同样需要解构来拿到纯结果集。

内容的提问来源于stack exchange,提问作者Faheel Sattar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:40:50