node.js调试问题
发布于 7 年前 作者 lzszone 4097 次浏览 来自 问答

老哥们,在下目前的项目遇到一个bug,无法重现 具体表现为: node命令行显示能收到请求 前台收不到任何服务器的返回 前台post数据到后台,数据库没有被写入 重启node程序即可正常工作 伴随有数据库崩溃,不丢数据,无法确认因果关系,不同时发生

目前没有什么解决思路,也不能重现问题,仅有一些猜测:

node异常 node执行程序某一部分的时候似乎被阻塞了,但是程序全是异步写的,目前没看到有用同步的地方,在下对node底层不熟,也不知道存不存在这种情况

数据库异常 这个看起来好像更合理,因为命令行打印,说明程序应该没死,然后到数据库的请求一直得不到返回,程序就像假死了一样,但是也有奇怪的地方,因为数据库出错那为什么重启node程序就可以正常工作了?

数据库驱动异常 如果是这种情况好像重启程序就正常也有了解释,驱动设置应该是没问题的

node版本: 6.10.* LTS 框架: express 服务器: win server 2012 数据库: arangodb 驱动: arangojs

想问大家的问题:

  1. 之前在网上看到一篇关于node统计每个函数运行时间的指令…没记录忘了(尴尬).搜也搜不出来,有老哥知道吗?
  2. 有老哥遇到过类似的问题吗? 是什么原因,怎么调试解决的?
  3. node.js或者express下如何弄一个如果响应时间超过多少就不作处理的东西 4 任何建议

happy holiday

7 回复

这个数据没用过。 有连接池的概念么,如果有的话 检查下是否连接满了未释放导致的。

@imhered 谢谢,我得看看文档了,有帮助

会不会是跨域

看情况感觉像是有异常没有catch到导致程序不继续工作,而且应该跟数据库相关,通常去检查下自己代码跟驱动(通常是自己的,当然也不排除驱动)

问题解决了,但是不知道为什么,从两个方面解决的:

  1. 驱动arangojs采用自动连接池管理连接数,但是默认的设置对象设置的最大链接数太小了,是3,然后根据github issue里面的作者自己的描述,最好改为arangoDB使用的线程数(默认为1),同时有人提出设置为50左右会比较好。设置连接数issue 自动连接池管理,目前我们使用50
  2. arangoDB安装默认仅使用了一个线程,我们使用的是windows server,所以需要修改服务,google了一下,把原来的服务停掉,新增了一个参数–server.threads 服务器设置,目前设置为10

目前服务器再没有出现过异常,下面是大概的arangojs连接设置:

const arango = require('arangojs');
const aql = arango.aql;

const config = {
  url: 'http://username:@ip:port',
  databaseName: 'name',
  arangoVersion: 20800, //version, for using old version of arangoDB
  agentOptions: {
    maxSockets: 50, //default is 3
    keepAlive: true,
    keepAliveMsecs: 1000
}
const db = arango(config);

module.exports = {
  getDB: () => db,
  getAql: () => aql
}

谢谢@imhered 老哥提供的方向

@lzszone 不容易,快一个月了,解决了就好。

回到顶部