NodeJS/Express: ECONNRESET при выполнении нескольких запросов с использованием Sequelize/Epilogue

Я строю веб-приложение, используя следующую архитектуру:

  • база данных postgresql (называется DB),
  • сервис NodeJS (называемый DBService), использующий Sequelize для манипулирования БД и Epilogue для предоставления интерфейса REST через Express,
  • служба NodeJS, называемая Backend, служащая в качестве серверной части и использующая DBService, генерировала вызовы REST.
  • веб-сайт AngularJS под названием Frontend, использующий Backend

Вот версия, которую я использую:

  • PostgreSQL 9.3
  • Sequelize 2.0.4
  • Эпилог 0.5.2
  • Экспресс 4.13.3

Моя схема БД довольно сложна и содержит 36 таблиц, а некоторые из них содержат несколько сотен записей. БД предназначена не для записи данных очень часто, а главным образом для их чтения.

Но недавно я создал скрипт в Backend для полной проверки данных, содержащихся в БД: в основном этот скрипт извлекает все данные всех таблиц и выполняет некоторые базовые проверки данных. В настоящее время скрипт только читает в базе данных.

Чтобы выполнить мой сценарий, я должен был убрать ограничение нумерации страниц Эпилога, используя опцию pagination: false (см. https://github.com/dchester/epilogue).

Но теперь, когда я запускаю свой скрипт, я случайно получаю такую ​​ошибку:

Запрос не выполнен при попытке получить уникально связанные объекты с URL: http://localhost:3000/CallTypes/178/RendererThemes.

Код: -1

Сообщение: ошибка: подключите ECONNRESET 127.0.0.1:3000

Ошибка случайно появляется во время выполнения скрипта: тогда возвращается не всегда этот URL, и даже не всегда одни и те же таблицы или отношения. Сообщение об ошибке перед кодом является пользовательским сообщением, возвращаемым Backend.

URL является ссылкой на DBService, но я не вижу в этом никакой ошибки, даже используя logging: console.log в продолжении и DEBUG=express:* чтобы увидеть, что происходит в Express.

Я попытался добавить setTimeout в свой скрипт Backend, чтобы замедлить его без каких-либо реальных изменений. Я также пытался манипулировать различными значениями, такими как PostgreSQL max_connections предел (я устанавливаю ограничение на 1000 подключений), или Sequelize maxConcurrentQueries а также pool ценности, но пока безуспешно. Я не нашел, где можно настроить подключение пула Express, возможно, это должно сработать.

Я предполагаю, что ошибка происходит от DBService, от конфигурации Express или где-то в конфигурации БД (либо в Sequelize/Epilogue, либо даже на самом сервере postgreSQL), но так как я не вижу никакой ошибки ни в одном журнале, я Точно сказать не могу.

Любая идея, чтобы помочь мне решить это?

РЕДАКТИРОВАТЬ

После дальнейшего изучения я, возможно, нашел ответ, который очень похож на Как избежать ошибки NodeJS ECONNRESET?: Я использую свой собственный объект RestClient для выполнения http-запроса, и этот объект был построен как одиночный с помощью этого метода:

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

Тогда я всегда использовал один и тот же объект для выполнения всех моих запросов, и когда процесс был слишком быстрым, он создавал коллизии... Поэтому я просто удалил тест if(RestClient.client == null) и пока что это похоже на работу. Если есть лучший способ управлять этим, закрыв запрос или управляя пулом, не стесняйтесь вносить свой вклад:)

0 ответов

Другие вопросы по тегам