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
相关产品推荐
相关产品推荐

