0

I'm building a webapp using the following the architecture:

  • a postgresql database (called DB),
  • a NodeJS service (called DBService) using Sequelize to manipulate the DB and Epilogue to expose a REST interface via Express,
  • a NodeJS service called Backend serving as a backend and using DBService threw REST calls
  • an AngularJS website called Frontend using Backend

Here are the version I'm using:

  • PostgreSQL 9.3
  • Sequelize 2.0.4
  • Epilogue 0.5.2
  • Express 4.13.3

My DB schema is quite complex containing 36 tables and some of them contains few hundreds of records. The DB is not meant to write data very often, but mostly to read them.

But recently I created a script in Backend to make a complete check up of datas contained inside the DB: basically this script retrieve all datas of all tables and do some basic checks on datas. Currently the script only does reading on database.

In order to achieve my script I had to remove the pagination limit of Epilogue by using the option pagination: false (see https://github.com/dchester/epilogue#pagination).

But now when I launch my script I randomly obtained that kind of error:

The request failed when trying to retrieve a uniquely associated objects with URL:http://localhost:3000/CallTypes/178/RendererThemes.

Code : -1

Message : Error: connect ECONNRESET 127.0.0.1:3000

The error randomly appears during the script execution: then it's not always this URL which is returned, and even not always the same tables or relations. The error message before code is a custom message returned by Backend.

The URL is a reference to the DBService but I don't see any error in it, even using logging: console.log in Sequelize and DEBUG=express:* to see what happens in Express.

I tried to put some setTimeout in my Backend script to slow it, without real change. I also tried to manipulate different values like PostgreSQL max_connections limit (I set the limit to 1000 connections), or Sequelize maxConcurrentQueries and pool values, but without success yet. I did not find where I can customize the pool connection of Express, maybe it should do the trick.

I assume that the error comes from DBService, from the Express configuration or somewhere in the configuration of the DB (either in Sequelize/Epilogue or even in the postgreSQL server itself), but as I did not see any error in any log I'm not sure.

Any idea to help me solve it?

EDIT

After further investigation I may have found the answer which is very similar to How to avoid a NodeJS ECONNRESET error? : I'm using my own object RestClient to do my http request and this object was built as a singleton with this method:

var NodeRestClient : any = require('node-rest-client').Client;
...
static getClient() {
    if(RestClient.client == null) {
        RestClient.client = new NodeRestClient();
    }
    return RestClient.client;
}

Then I was always using the same object to do all my requests and when the process was too fast, it created collisions... So I just removed the test if(RestClient.client == null) and for now it seems to work. If there is a better way to manage that, by closing request or managing a pool feel free to contribute :)

Community
  • 1
  • 1
Simon Urli
  • 449
  • 1
  • 5
  • 12
  • When you say you have two Node "services", do you mean you have two separately running Node instances? Do both of these have open ports? – Lucas Watson Jul 16 '16 at 21:23
  • Yes exactly. There are both running well. – Simon Urli Jul 18 '16 at 05:41
  • Are both taking up a port (i.e. both on 3000)? ECONNRESET sometimes can be triggered by two node instances trying to use and communicate with a third entity over the same port. – Lucas Watson Jul 19 '16 at 15:55

0 Answers0