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

