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 ;)
我正在使用 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 ;)