Node-Postgres:使用 Express 30 秒后程序无法运行,没有 Express 没有问题

Node-Postgres: program does not work after 30 seconds while using Express, no problems without Express

我正在使用 node-postgres 从 NodeJS 连接到 Postgres 数据库;它在 运行 程序 30 秒后(在对服务器的第一次请求之后)给出了一个奇怪的错误 Cannot read property 'rows' of undefined。如果我不使用 Express,错误就会消失。

我已删除重现错误的代码:

  1 var conn_string = "pg://postgres@localhost:5432/foobardb";
  2 var express = require("express");
  3 var pg = require("pg");
  4 var router_home = express.Router();
  5 var app = express();
  6
  7 pg.connect(conn_string, function(err, client, done){
  8         router_home.get("/", function(req, res, next){
  9                 client.query("select * from visit", function(err, result){
 10                         done();
 11                         res.end(JSON.stringify(result.rows[0]));
 12                 });
 13         });
 14 });
 15 app.use("/", router_home);
 16 app.listen(8080);
此代码示例的

运行 curl -X GET http://localhost:8080/ 前几次工作得很好,然后在 30 秒后失败(在第一次 运行 之后)并给出以下错误:

TypeError: Cannot read property 'rows' of undefined
    at null.callback (/Users/yc/nodeProjects/pgExpress.js:11:33)
    at Query.handleError (/Users/yc/nodeProjects/node_modules/pg/lib/query.js:106:17)
    at null.<anonymous> (/Users/yc/nodeProjects/node_modules/pg/lib/client.js:171:26)
    at emitOne (events.js:90:13)
    at emit (events.js:182:7)
    at Socket.<anonymous> (/Users/yc/nodeProjects/node_modules/pg/lib/connection.js:59:10)
    at emitOne (events.js:90:13)
    at Socket.emit (events.js:182:7)
    at Socket.writeAfterFIN [as write] (net.js:281:8)
    at Connection.query (/Users/yc/nodeProjects/node_modules/pg/lib/connection.js:189:15)

如果我在不使用 Express 的情况下重写同一个程序,它可以无限期地工作。

  1 var conString = "pg://postgres@localhost:5432/foobardb";
  2
  3 var http = require('http');
  4 var pg = require('pg');
  5
  6 var server = http.createServer(function(req, res) {
  7     pg.connect(conString, function(err, client, done) {
  8
  9         client.query("select * from visit", function(err, result) {
 10             done();
 11             res.end(JSON.stringify(result.rows[0]));
 12           });
 13         });
 14 });
 15 server.listen(3001);

除了使用Express,代码完全相同。我真的很困惑。我的猜测是它可能与缓存有关,尽管我不明白为什么当我不使用 Express 时它会消失。非常感谢修复或如何解决此问题(同时仍在使用 Express)!

这与 express 无关,而是关于数据库连接的逻辑错误。

在您的初始代码中,您首先连接到数据库,然后设置 HTTP 侦听器,然后进行查询,然后释放连接。在第二次通话时,您将泄露您的连接。你这样做的逻辑完全被打破了。

你应该这样做:设置 HTTP 侦听器,一旦你收到请求,连接到数据库,进行查询,释放连接。

如果您想要一种不需要关心连接的更简单的方法,请查看 pg-promise ;)