这篇文章主要介绍了nodejs超出最大的调用栈错误问题,需要的朋友可以参考下

今天早上老大和我说之前项目里面的那个数据要改动,要对 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);

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

node.js超过php,在nodejs中如何解决超出最大的调用栈错误相关推荐

  1. 如何把 Node.js 嵌入自己的项目中

    Node.js 不仅可以单独运行,还可以以库的方式被使用,本文介绍下如何把 Node.js 嵌入到自己项目中. 首先第一步下载 Node.js 源码,然后根据 Node.js 的文档进行编译安装.这样 ...

  2. 唤醒手腕 - 前端服务器端开发 Node.Js 学习笔记(学习中,更新中)

    唤醒手腕 - Node.Js 学习笔记 唤醒手腕个人的学习记录,时间在2021年12月13日 ~ 2021年12月14日,学习方式看官方文档和B站视频,如有错误或者代码问题的地方,欢迎C站大佬能够帮忙 ...

  3. Node.js 使用jQuery取得Nodejs http服务端返回的JSON对象示例

    server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http" ...

  4. node.js 入门操作 持续学习中

    系列文章目录 本系列为我的node.js学习记录,欢迎大家参考和指出我的不足. 目录 系列文章目录 前言 node.js模块开发 具体用法: 一些简单的系统模块 js代码测试: 总结 前言 首先今天原 ...

  5. 【Node】node.js实现服务器的反向代理,解决跨域问题

    跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...

  6. [推荐] 一个 Node.js 技术选型案例:使用 CARMEN 作为卡牌手游技术栈

    作者 @超人张宝胜 ,原文地址:https://zhuanlan.zhihu.com/p/103724412,如需转载请联系作者授权. 前言 本文介绍了在资金.人员.时间上全面告急.云服务提供商不确定 ...

  7. Notadd 2.0 全新 Node.js 版本~ (开发中) [从 PHP 到 node 的踩坑记]

    对于 Notadd 我们本来期望它实现更多...  尽管我们也尝试做了很多努力,但是由于 PHP 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案. 接下来,我们谈谈整个技术选型历程, ...

  8. node.js测试html tdd,nodejs的单元测试框架mocha

    # nodejs的单元测试框架mocha 当我们编写比较复杂的项目时,需要对项目的测试用例进行长期跟踪,对单元模块进行质量控制,对开发成果进行自我检验,那么需要一个好用的工具,自学了一下mocha,这 ...

  9. 在 node.js 的 express web 框架中自动注册路由

    该方法主要是动态注册自己写的 router . 注册器 router 文件名为 loader.js  . var express = require('express'); var fs = requ ...

最新文章

  1. window.opener方法的使用 js跨域
  2. vue 渲染函数处理slot_面试官:Vue 和 React 对于组件的更新粒度有什么区别?
  3. 保留字(reserved field)是什么意思?
  4. spring boot 所有引用jar包及作用
  5. CentOS 初体验五: SSH远程连接
  6. boost::kruskal_minimum_spanning_tree用法的测试程序
  7. 个人工作总结05(第二次冲刺)
  8. 2019年度最受欢迎中国开源软件评选, 请给JeecgBoot 投票,谢谢支持
  9. ado显示,删除后刷新重新显示
  10. 静态页面转换为模板2
  11. 从《学书津梁》看五体创作思路(篆书)
  12. SteamVR简介(Yanlz+Steam+VR+Unity+AR+MR+XR+=)
  13. BUG的跟踪管理、定位BUG
  14. 世界各国首都经纬度-json
  15. 纯电动汽车整车控制器(VCU)详细介绍
  16. 局部连接层(Locally-Connected Layer)
  17. popos ubuntu20升级更新AMD显卡GPU驱动
  18. golang 依赖管理_简介:如何管理Golang项目依赖项
  19. iOS:注册App ID
  20. 【抓包教程】- 微信视频号下载教程,使用charles抓包工具,如何设置charles抓包工具,以及具体在某一个视频上如何抓包

热门文章

  1. c mysql linux,linux上C语言连接mysql
  2. python logging使用_[译]Python Logging 使用指南
  3. Qt常用数据类型转换
  4. 关于Qt5.10调试时出现“qtcreatorcdbext.dll cannot be found.”的解决方案
  5. Python Imaging Library: ImageEnhance Module(图像增强模块)
  6. weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中weblogic.jspc预编译JSP
  7. eclipse代码自动提示,eclipse设置代码自动提示
  8. java设计模式之装饰者模式
  9. 详述怎么使用Linux救援模式
  10. 定制软件项目经理应该善于说“NO”