如何在特定路由无对应记录时返回JSON格式错误信息?
问题:查询不存在的ID时无法返回指定格式的错误JSON
我正在构建一个用于数据提交与插入的API,支持向POST端点提交数据、从数据库获取全部数据,还能通过ID查询特定行的单条数据。我希望当查询不存在的ID时,返回如下格式的JSON错误信息:
[ { "error": "no record found in DB" } ]
以下是我当前使用的代码:
app.get('/users/:id',async(req,res)=>{ try { const id = req.params.id conn = await pool.getConnection() const result = await conn.query("select * from info where id=?",id) if(!result){ res.json({ "error":"no such record in database" }) }else{ res.send(result) } } catch (error) { res.send(error) } })
我尝试通过if语句判断查询无结果时执行错误返回逻辑,但实际返回的是空JSON。
解决方案
问题原因
多数数据库驱动(如mysql2)执行SELECT查询后,即便没有匹配数据,返回的result也是空数组而非null或undefined,所以原代码中!result的判断永远不会触发,直接返回了空数组(即空JSON)。
修改后的代码
app.get('/users/:id', async(req, res) => { let conn; try { const id = req.params.id conn = await pool.getConnection() // 部分数据库驱动要求查询参数以数组形式传入 const result = await conn.query("select * from info where id=?", [id]) if(result.length === 0){ // 返回指定格式的错误信息,并设置404状态码 res.status(404).json([ { "error": "no record found in DB" } ]) }else{ res.send(result) } } catch (error) { // 统一错误返回格式,设置500状态码 res.status(500).json([{"error": error.message}]) } finally { // 无论请求成功或失败,都释放数据库连接,避免连接池耗尽 if(conn) conn.release() } })
关键修改点
- 判断条件修正:用
result.length === 0替代!result,准确识别无匹配数据的情况 - 错误格式对齐:返回要求的数组结构错误信息,同时设置符合REST规范的404状态码
- 参数传递修正:将查询参数放入数组
[id],适配多数数据库驱动的参数绑定要求 - 连接泄漏修复:添加
finally块确保数据库连接被释放,避免连接池耗尽 - 异常处理优化:统一异常返回格式,设置500状态码
内容的提问来源于stack exchange,提问作者denis kiplangat
相关产品推荐
相关产品推荐

