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

使用Express+pg操作PostgreSQL时查询阻塞服务器问题求助

Express + pg 查询阻塞服务器的问题修复

问题根源

你的代码存在几个关键错误,导致查询逻辑异常并阻塞服务器:

  • 语法错误:client.query调用时错误使用逗号分隔查询语句和回调函数,导致回调未绑定到query方法,query变成无回调的异步操作,同时回调成为独立的无效代码块。
  • 参数重名:回调函数的res参数与路由处理函数的响应对象res重名,会覆盖原响应对象,导致无法正确返回响应。
  • 未定义变量:渲染页面时使用的posts变量未定义,应该替换为查询返回的结果。
  • 异步处理不规范:路由标记为async但未用await处理异步操作,也没有错误捕获机制。

修复后的代码

var router = express.Router()
const { Client } = require('pg')

const client = new Client({
    user: 'dev', 
    host: 'localhost',
    database: 'fransua',
    password: 'azerty123456789',
    port: 5432
})

// 连接数据库时添加错误捕获
client.connect((err) => {
    if (err) {
        console.error('数据库连接失败', err.stack)
    } else {
        console.log('数据库连接成功')
    }
})

router.get('/database', async (req, res) => {
    try {
        // 使用await处理异步查询,避免回调嵌套,同时避免参数重名
        const result = await client.query("SELECT * FROM employees WHERE first_name= $1", ['Roam'])
        console.log(result.rows)
        // 使用查询结果作为posts参数传递
        res.render("database", {title: "Database", posts: result.rows})
    } catch (err) {
        console.error(err.stack)
        // 返回错误响应
        res.status(500).send('数据库查询失败')
    }
})

关键修改说明

  • 将逗号改为括号,把回调正确绑定到client.query(或直接用async/await替代回调,代码更清晰)
  • 避免参数重名,改用result接收查询结果
  • 定义posts为查询返回的result.rows
  • 使用try/catch捕获异步操作中的错误,确保服务器不会因为未处理的异常阻塞
  • 给client.connect添加错误处理,提前排查连接问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:24:25