0

我正在使用 node-postgres 从 NodeJS 连接到 Postgres 数据库;Cannot read property 'rows' of undefined在运行程序 30 秒后(在第一次请求服务器之后),它给出了一个奇怪的错误。如果我不使用 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)将不胜感激!

4

1 回答 1

1

这与快递无关,而是与您的数据库连接逻辑错误有关。

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

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

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

于 2016-05-11T14:01:20.300 回答