NodeJS / Express:使用Sequelize / Epilogue进行多次请求时的ECONNRESET

时间:2016-07-16 12:39:31

标签: node.js postgresql express sequelize.js epilogue

我正在使用以下架构构建一个webapp:

  • 一个postgresql数据库(称为DB),
  • 一个NodeJS服务(称为DBService),使用Sequelize操纵数据库和Epilogue以通过Express公开REST接口,
  • 一个名为Backend的NodeJS服务作为后端并使用DBService投掷REST调用
  • 一个名为Frontend的AngularJS网站,使用Backend

以下是我正在使用的版本:

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

我的数据库架构非常复杂,包含36个表,其中一些表包含数百条记录。数据库并不是经常写数据,而是主要用于读取数据。

但是最近我在Backend中创建了一个脚本来对DB中包含的数据进行全面检查:基本上这个脚本检索所有表的所有数据并对数据进行一些基本检查。目前,该脚本只能读取数据库。

为了实现我的脚本,我必须使用pagination: false选项删除Epilogue的分页限制(请参阅https://github.com/dchester/epilogue#pagination)。

但是现在当我启动脚本时,我随机获得了那种错误:

  

尝试使用网址http://localhost:3000/CallTypes/178/RendererThemes检索唯一关联的对象时,请求失败。

     

代码:-1

     

消息:错误:连接ECONNRESET 127.0.0.1:3000

在脚本执行期间随机出现错误:然后并不总是返回此URL,甚至不总是相同的表或关系。代码之前的错误消息是Backend返回的自定义消息。

该URL是对DBService的引用,但我没有看到任何错误,即使在Sequelize和logging: console.log中使用DEBUG=express:*来查看Express中会发生什么。

我试图在我的后端脚本中添加一些setTimeout来减慢速度,而没有真正的改变。我还试图操纵不同的值,如PostgreSQL max_connections限制(我将限制设置为1000个连接),或者Sequelize maxConcurrentQueriespool值,但尚未成功。 我没有找到我可以自定义Express的池连接的地方,也许它应该做的伎俩。

我认为错误来自DBService,来自Express配置或DB配置中的某个位置(在Sequelize / Epilogue中,甚至在postgreSQL服务器本身中),但因为我没有在任何日志中看到任何错误我不确定。

有什么想法可以帮我解决吗?

修改

经过进一步调查后,我可能找到了与How to avoid a NodeJS ECONNRESET error?非常相似的答案 :我正在使用自己的对象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 个答案:

没有答案