Javascript 一行查询数据库两次时出现EconReset写入错误[Node.js]
我有一个node.js文件,其中包含从heroku postgresql数据库读取和写入的方法。我使用“pg”模块访问数据库。我的问题是,连续多次调用getSleepMode函数会导致EconReset错误。此函数只向my DB发送一个查询并检索一个整数。我理解这可能是因为node.js函数是非阻塞的,getSleepMode()的两个实例都试图同时访问我的DB。但是,如果多个客户机同时试图从我的数据库中获取数据,这难道不是一个问题吗?假设我的heroku postgresql数据库可以同时处理来自多个客户机的查询,这是否仍然有效?我有以下代码的相关部分:Javascript 一行查询数据库两次时出现EconReset写入错误[Node.js],javascript,node.js,postgresql,heroku,econnreset,Javascript,Node.js,Postgresql,Heroku,Econnreset,我有一个node.js文件,其中包含从heroku postgresql数据库读取和写入的方法。我使用“pg”模块访问数据库。我的问题是,连续多次调用getSleepMode函数会导致EconReset错误。此函数只向my DB发送一个查询并检索一个整数。我理解这可能是因为node.js函数是非阻塞的,getSleepMode()的两个实例都试图同时访问我的DB。但是,如果多个客户机同时试图从我的数据库中获取数据,这难道不是一个问题吗?假设我的heroku postgresql数据库可以同时处理
[database connection variables omitted]
var pg = require("pg")
var conString = "pg://" + USER + ":" + PW + "@" + HOST + ":" + PORT + "/" +
DATABASE + "?ssl=true";
var client = new pg.Client(conString);
/*This function accesses my database and retrieves an integer field
called "sleepmode"*/
function getSleepMode(username) {
var query = "SELECT sleepmode FROM \"Users\" where username='" +
username + "';";
connectWrapper(query, function(err,result) {
if (err) {
return console.err("Error getting sleep mode", err);
}
client.end();
console.log("sleepmode " + result.rows[0].sleepmode);
});
}
/*This function is here so I can reuse it for more than just
my getSleepMode() function*/
function connectWrapper(query, handler) {
client.connect(function(err) {
if (err) {
return console.error('could not connect to postgresq',err);
}
client.query(query, handler);
});
}
getSleepMode("username1"); //This ALONE works
getSleepMode("username2"); //but when this line follows, i get the error
运行此命令将导致以下输出:
$user: node dbconnect.js
could not connect to postgresq { [Error: write ECONNRESET] code: 'ECONNRESET', err
ECONNRESET', syscall: 'write' }
could not connect to postgresq { [Error: write ECONNRESET] code: 'ECONNRESET', err
ECONNRESET', syscall: 'write' }
Events.js:72
throw er; // Unhandled 'error' event
^
Error: write ECONNRESET
at errnoException (net.js:904:11)
at Socket._write (net.js:645:26)
at doWrite (_stream_writable.js:225:10)
at writeOrBuffer (_stream_writable.js:215:5)
at Socket.Writable.write (_stream_writable.js:182:11)
at Socket.write (net.js:615:40)
at write (_stream_readable.js:601:24)
at flow (_stream_readable.js:610:7)
at _stream_readable.js:578:7
at process._tickCallback (node.js:419:13)
但是,当我运行它以便只调用一次getSleepMode()时,不会出现错误,它可以按预期工作
$user: node dbconnect.js
sleepmode 1
您两次结束客户端(
client.end();
),这可能会导致您的问题。具体来说,它看起来像是在另一个查询完成之前关闭了连接。那么,如果我有两个不同的客户端执行各自的查询,那么这应该可以工作吗?例如,如果在两个不同的设备上加载了这个node.js应用程序,那么这两个不同的设备可以同时查询数据库而不会出现问题?您应该使用的是连接池。幸运的是,pg
内置了连接池和。因此,据我所知,您只需调用一次connect()
,然后继续调用query()
,而不要手动调用end()
。