node.js超过php,在nodejs中如何解决超出最大的调用栈错误
这篇文章主要介绍了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中如何解决超出最大的调用栈错误相关推荐
- 如何把 Node.js 嵌入自己的项目中
Node.js 不仅可以单独运行,还可以以库的方式被使用,本文介绍下如何把 Node.js 嵌入到自己项目中. 首先第一步下载 Node.js 源码,然后根据 Node.js 的文档进行编译安装.这样 ...
- 唤醒手腕 - 前端服务器端开发 Node.Js 学习笔记(学习中,更新中)
唤醒手腕 - Node.Js 学习笔记 唤醒手腕个人的学习记录,时间在2021年12月13日 ~ 2021年12月14日,学习方式看官方文档和B站视频,如有错误或者代码问题的地方,欢迎C站大佬能够帮忙 ...
- Node.js 使用jQuery取得Nodejs http服务端返回的JSON对象示例
server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http" ...
- node.js 入门操作 持续学习中
系列文章目录 本系列为我的node.js学习记录,欢迎大家参考和指出我的不足. 目录 系列文章目录 前言 node.js模块开发 具体用法: 一些简单的系统模块 js代码测试: 总结 前言 首先今天原 ...
- 【Node】node.js实现服务器的反向代理,解决跨域问题
跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...
- [推荐] 一个 Node.js 技术选型案例:使用 CARMEN 作为卡牌手游技术栈
作者 @超人张宝胜 ,原文地址:https://zhuanlan.zhihu.com/p/103724412,如需转载请联系作者授权. 前言 本文介绍了在资金.人员.时间上全面告急.云服务提供商不确定 ...
- Notadd 2.0 全新 Node.js 版本~ (开发中) [从 PHP 到 node 的踩坑记]
对于 Notadd 我们本来期望它实现更多... 尽管我们也尝试做了很多努力,但是由于 PHP 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案. 接下来,我们谈谈整个技术选型历程, ...
- node.js测试html tdd,nodejs的单元测试框架mocha
# nodejs的单元测试框架mocha 当我们编写比较复杂的项目时,需要对项目的测试用例进行长期跟踪,对单元模块进行质量控制,对开发成果进行自我检验,那么需要一个好用的工具,自学了一下mocha,这 ...
- 在 node.js 的 express web 框架中自动注册路由
该方法主要是动态注册自己写的 router . 注册器 router 文件名为 loader.js . var express = require('express'); var fs = requ ...
最新文章
- window.opener方法的使用 js跨域
- vue 渲染函数处理slot_面试官:Vue 和 React 对于组件的更新粒度有什么区别?
- 保留字(reserved field)是什么意思?
- spring boot 所有引用jar包及作用
- CentOS 初体验五: SSH远程连接
- boost::kruskal_minimum_spanning_tree用法的测试程序
- 个人工作总结05(第二次冲刺)
- 2019年度最受欢迎中国开源软件评选, 请给JeecgBoot 投票,谢谢支持
- ado显示,删除后刷新重新显示
- 静态页面转换为模板2
- 从《学书津梁》看五体创作思路(篆书)
- SteamVR简介(Yanlz+Steam+VR+Unity+AR+MR+XR+=)
- BUG的跟踪管理、定位BUG
- 世界各国首都经纬度-json
- 纯电动汽车整车控制器(VCU)详细介绍
- 局部连接层(Locally-Connected Layer)
- popos ubuntu20升级更新AMD显卡GPU驱动
- golang 依赖管理_简介:如何管理Golang项目依赖项
- iOS:注册App ID
- 【抓包教程】- 微信视频号下载教程,使用charles抓包工具,如何设置charles抓包工具,以及具体在某一个视频上如何抓包
热门文章
- c mysql linux,linux上C语言连接mysql
- python logging使用_[译]Python Logging 使用指南
- Qt常用数据类型转换
- 关于Qt5.10调试时出现“qtcreatorcdbext.dll cannot be found.”的解决方案
- Python Imaging Library: ImageEnhance Module(图像增强模块)
- weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中weblogic.jspc预编译JSP
- eclipse代码自动提示,eclipse设置代码自动提示
- java设计模式之装饰者模式
- 详述怎么使用Linux救援模式
- 定制软件项目经理应该善于说“NO”