Express+PostgreSQL插入数据后出现"Write after end"错误,求解决方法
解决Express+PostgreSQL的"Write after end"错误
嘿,这个坑我之前也踩过!一眼就能看出问题出在你手动调用的db.end()上——这完全违背了连接池的设计逻辑,直接导致了后续请求的报错。
问题根源
你用的是PostgreSQL连接池(pool.connect()),连接池的核心价值就是复用数据库连接,避免每次请求都新建/关闭连接带来的性能损耗。但你在查询完成后手动调用db.end(),直接把从池里拿到的连接给关闭了。当后续请求再尝试从池里获取这个已经失效的连接时,就会触发"Write after end"错误——本质是你试图往一个已经关闭的连接里写入数据。
另外要注意:你的错误分支里已经调用了done()释放连接,但成功分支里的db.end()完全是画蛇添足,反而破坏了连接池的复用机制。
修正步骤
- 立刻移除
db.end()调用:连接池提供的done()函数已经负责将连接放回连接池,供后续请求复用,不需要手动关闭单个连接。 - 确保所有分支都调用
done():哪怕查询出错,也要调用done(),避免连接泄漏(你的代码里已经做到了这一点,继续保持这个好习惯)。
修正后的代码片段
pool.connect((err, db, done) => { if(err) { done(); // 出错时也要释放连接,避免泄漏 return response.status(400).send(err); } else { db.query('INSERT INTO news (headline, date, content, images, id, snippet, author) VALUES($1, $2, $3, $4, $5, $6, $7)',[...values], (err, table) => { done(); // 无论成功失败,都把连接放回池 if (err) { return response.status(400).send(err); } else { console.log('DATA INSERTED'); // 这里彻底删掉db.end()!!! } }) } })
额外优化建议
建议改用Promise风格的API(pool.query()直接返回Promise),回调嵌套不仅容易出错,可读性也差:
// 记得把外层函数改成async try { const result = await pool.query( 'INSERT INTO news (headline, date, content, images, id, snippet, author) VALUES($1, $2, $3, $4, $5, $6, $7)', [...values] ); console.log('DATA INSERTED'); response.status(200).send('数据插入成功'); } catch (err) { response.status(400).send(err); }
这种方式不需要手动处理done(),连接池会自动管理连接的释放,代码也更简洁。
内容的提问来源于stack exchange,提问作者Tank12
相关产品推荐
相关产品推荐

