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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:36:08