0

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

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

这是我正在使用的版本:

  • PostgreSQL 9.3
  • 续集 2.0.4
  • 结语 0.5.2
  • 快递 4.13.3

我的数据库模式非常复杂,包含 36 个表,其中一些包含数百条记录。DB 并不是要经常写入数据,而主要是为了读取它们。

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

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

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

尝试检索具有 URL 的唯一关联对象时请求失败:http://localhost:3000/CallTypes/178/RendererThemes

代码:-1

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

错误在脚本执行期间随机出现:返回的并不总是这个 URL,甚至不总是相同的表或关系。code之前的错误信息是Backend返回的自定义信息。

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

我试图在我的后端脚本中放一些 setTimeout 来减慢它,而没有真正的改变。我还尝试操作不同的值,例如 PostgreSQLmax_connections限制(我将限制设置为 1000 个连接)或 SequelizemaxConcurrentQueriespool值,但还没有成功。我没有找到可以自定义 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),现在它似乎工作了。如果有更好的方法来管理它,请通过关闭请求或管理池随时贡献:)

4

0 回答 0