nodejs超出最大的调用栈错误问题


Posted in NodeJs onDecember 27, 2017

今天早上老大和我说之前项目里面的那个数据要改动,要对 mongodb 中每条记录进行 update 操作,你写个脚本跑一下吧。

然后,我默默的回到电脑前,努力工作的一天又开始了。由于此表数据量有点略大,该有一千多万条记录。所以考虑使用 mongodb 的 cursor 游标来进行遍历修改。

程序实现的代码大致如下

function modify(cursor) {
  cursor.hasNext(function(err,bool) {
   if(err) {
      return console.log(err); 
    } 
    if(bool) {
      cursor.next(function(err, item){
       if(err) {
       return console.log(err);
     }
     /* 此处为对数据进行update操作 */
     // 递归调用modify方法 
     return modify(cursor);
   }); 
    }else{
      console.log('finished');
    }
  })
}
var cursor = collection.find();
modify(cursor);

然后让它慢慢跑吧,可是一个令我郁闷的事情发生了。当游标跑到接近500万的时候,程序崩了,提示Uncaught RangeError: Maximum call stack size exceeded

竟然告诉我爆栈了,什么情况? 哎,排查代码,开始填坑。发现我上面递归调用了modify() ,而且递归次数有点小多(1000多万条记录的表啊),可能是函数不断的递归调用导致它的调用栈不断的增加,然后越来越大,最终就没有然后了,爆栈了。看来得给个机会让node进行垃圾回收一下,要想让它有机会垃圾回收那就只得终结一下递归啊。使用系统的setTimeout();来跳出递归调用栈吧。

代码修改如下

function modify(cursor) { 
  cursor.hasNext(function(err,bool) {
    if(err) {
      return console.log(err); 
    }
    if(bool) {      
      cursor.next(function(err, item){
        if(err) {
          return console.log(err);
        }
        /* 此处对数据进行update操作 */
        // 递归调用modify方法 
        return setTimeout(function(){ 
              //跳出递归调用栈
              modify(cursor);
            },0);
      }); 
    }else{
      console.log('finished');
    }
  })
}
var cursor = collection.find();
modify(cursor);

在跑一下试试。。。。ok,好使了。但是运行有点慢啊,因为我每次都让它跳出递归调用栈了。这样虽然没问题但是没必要,因为400多万才会出现爆栈呢。加个计数器吧,等调用栈有点大的时候在跳出来。

var count = 0;
function modify(cursor) { 
  count++;
  cursor.hasNext(function(err,bool) {
    if(err) {
      return console.log(err); 
    }
    if(bool) {
      cursor.next(function(err, item){
        if(err) {
         return console.log(err);
        }
        /* 此处对数据进行update操作 */
        // 递归调用modify方法 
        if(count%10000 === 0) {
          return setTimeout(function(){ 
              //跳出递归调用栈
              modify(cursor);
              },0);
        }else{
          return modify(cursor);
        }    
      }); 
    }else{
      console.log('finished');
    }
  })
}
var cursor = collection.find();
modify(cursor);

总结

以上所述是小编给大家介绍的nodejs超出最大的调用栈错误问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

NodeJs 相关文章推荐
Nodejs+express+html5 实现拖拽上传
Aug 08 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 NodeJs
nodejs实现简单的gulp打包
Dec 21 #NodeJs
nodejs调取微信收货地址的方法
Dec 20 #NodeJs
基于nodejs实现微信支付功能
Dec 20 #NodeJs
nodeJS微信分享
Dec 20 #NodeJs
NodeJS爬虫实例之糗事百科
Dec 14 #NodeJs
nodejs实现爬取网站图片功能
Dec 14 #NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 #NodeJs
You might like
PHP 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
一个PHP操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
vue实现购物车小案例
2019/09/27 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
haskell实现多线程服务器实例代码
2013/11/26 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
python怎么对数字进行过滤
2020/07/05 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
毕业生找工作的自我评价
2013/10/18 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
谢师宴家长致辞
2015/07/27 职场文书
python实现自定义日志的具体方法
2021/05/28 Python