ECONNRESET Ошибка записи при запросе к базе данных два раза подряд [Node.js]
У меня есть файл node.js, в котором есть методы, которые читают и пишут из моей базы данных heroku postgresql. Я использую модуль 'pg' для доступа к БД. Моя проблема заключается в том, что вызов функции getSleepMode более одного раза подряд вызывает ошибку ECONNRESET. Эта функция просто отправляет запрос в мою БД и получает целое число. Я понимаю, что это может быть потому, что функции node.js не блокируют, и оба экземпляра getSleepMode() пытаются получить доступ к моей БД одновременно. Но не станет ли это проблемой, если более чем один клиент пытается получить данные из моей БД одновременно? Предполагая, что мой heroku postgresql db может обрабатывать запросы от нескольких клиентов одновременно, разве это не должно работать? У меня есть соответствующие части кода ниже:
[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
1 ответ
Ты заканчиваешь клиента дважды (client.end();
), которая может быть причиной вашей проблемы. В частности, похоже, что соединение закрыто до завершения выполнения другого запроса.