如何在Express中使用pg库捕获PostgreSQL查询的具体报错?
问题根因
- pg库的
pool.query方法不支持回调、Promise两种调用模式混用。你同时传入了回调函数时,await拿到的返回值会变为undefined,后续执行result.rows时抛出的类型错误覆盖了数据库本身返回的错误。 - 你的回调参数中第二个参数命名为
res,和外层Express的响应对象res重名,也会导致逻辑异常,回调内的错误打印逻辑无法正常触发。
修复方案
直接删除pool.query的回调参数,仅使用Promise + await模式调用,所有PostgreSQL返回的错误都会被外层try/catch捕获,pg返回的错误对象内置数据库错误的详细信息:
code:PostgreSQL标准错误码,比如42703对应字段不存在错误message:错误的简要描述detail:错误的详细说明
修复后的代码如下:
const pool = require('../db') const asyncHandler = require('express-async-handler') const { generateToken } = require('../middleware/userAuth') // @desc Register New User // @route POST /api/users/register // @public Public const registerUser = asyncHandler(async(req, res) => { const { email, name, password } = req.body const newUser = { name, email, password } const existingUser = '' if (existingUser) { res.status(400) throw new Error('User Already Exists') } else { try { // 移除回调参数,仅用await接收返回值 const result = await pool.query( 'INSERT INTO users (name, email, password) VALUES ($1, $2, $3) RETURNING *', [name, email, password] ) res.status(201) res.json(result.rows) } catch (error) { // 打印PG返回的完整错误信息 console.log('数据库错误码:', error.code) console.log('数据库错误描述:', error.message) console.log('数据库错误详情:', error.detail) res.status(400) throw new Error('Unable to create user') } } })
内容的提问来源于stack exchange,提问作者pancake
相关产品推荐
相关产品推荐

