Node.js,nodejsjava

2020-10-13 阅读 江文星整理

内容简介:nodejs与js区别几个node.js错误和解决方案总结如下:ebadf,write最近写了一个小项目。我以为我可以好好喝茶,但人们想把桌子抬起来的错误报告出现了。js:77 thnodejs vue...

几个node.js错误及解决办法整理如下node.jsError:EBADF,write最近工作写了个小项目,本以为能好好喝下茶,可是让人想掀桌的报错出现了。

fs.js:77throwerr;//Forgotacallbackbutdontknowwhere?UseNODE_DEBUG=fs^Error:EBADF,writeatError(native)WTF?!fs.js:77?这是要我去看内核源代码?

好在项目还不大,拆拆更健康。

花了半天的时间之后大概是清楚了。

首先是Error的名字EBADF其意义是badfiledescriptor错误的文件描述符。

而Error:EBADF,write表示往错误的文件描述符里面写数据了。

出现这个BUG的场景简而言之,是有一个.on(data)事件拿到数据往fd里面写,这个时候某个操作抛了error我在处理error的时候close了这个fd,而另外一边去还在触发data事件想往这个(已经被我close的)fd里面写数据。

如下://...varfd=fs.openSync(path,w);test.on(data,function(data){fs.write(fd,data);});test.on(end,function(){fs.close(fd);});//在end之前close就会出现Error:EBADF,writesetTimeout(function(){fs.close(fd);},10);//...解决方案:所以我们排查好出现fs.close关闭文件描述符的地方,确保close之后不会再有read/write。

Error:EBADF,close另外附上在谷歌的过程中看到了另外一个类似的错误。

这是当你为多种情况做fs.close(fd);的处理,然而不幸的是,多个情况被都触发,fs.close(fd)调用了多遍,同样也会出现EBADF错误。

这样就能出现:test.on(end,function(){fs.close(fd);fs.close(fd);//多调用了一次就会出现});不友好的报错fs.js:77throwerr;//Forgotacallbackbutdontknowwhere?UseNODE_DEBUG=fs^Error:EBADF,closeatError(native)解决方案:依旧是排查fs.close,只不过这次是要保证多种处理不会反复执行fs.close,或者你可以使用try/catch来无视它。

Error:EBADF,badfiledescriptor最后,当fd失效以后进行read操作的话,我还以为会出现Error:EBADF,read结果并没有。

以下是尝试出现BUG的代码://...fs.closeSync(fd);fs.readSync(fd,newBuffer(1024),0,1024);//...不过这个报错会友好很多,有将其调用栈打出来。

fs.js:552varr=binding.read(fd,buffer,offset,length,position);^Error:EBADF,badfiledescriptoratError(native)atObject.fs.readSync(fs.js:552:19)atcommand.anonymous(/Users/Lellansin/Documents/workspace/node/test-server/app/services/TestService.js:40:6)atcommand.emit(events.js:110:17)atChildProcess.emit(events.js:129:20)atmaybeClose(child_process.js:1015:16)atSocket.anonymous(child_process.js:1183:11)atSocket.emit(events.js:107:17)atPipe.close(net.js:485:12)解决方案:看错误栈去改代码就好了。

node.jsError:stdoutmaxBufferexceeded在使用child_process模块中的exec、execFile、spawnSync、execFileSync、execSync方法时需要注意其options参数中的maxBuffer项。

以上方法在执行时会在内存中建一个buffer来缓冲组合所有的输出数据,而maxBuffer则是指定该buffer大小的地方。

如果输出超过指定的大小则会报maxBufferexceeded的错误。

解决方案是执行的时候估计好大小,设置更大的maxBuffer:varexec=require(child_process).exec;varchild=exec(ls-lah,{encoding:utf8,timeout:0,maxBuffer:5000*1024,//默认200*1024killSignal:SIGTERM},function(err,stdout,stderr){console.log(stdout);});或者是用spawn的.on(data)事件触发时,手动拼接数据到.on(close)事件触发的时候获得完整数据。

pomeloCannotcallmethodforwardMessageofundefined报错信息:[2014-09-1014:32:45.315][DEBUG]pomelo-[E:svnxjmhtrunksrcservergame-servernode_modulespomelolibcomponentsconnector.js][connector-server-1]handleMessagesessionid:1,msg:{id:10,type:0,compressRoute:0,route:user.userHandler.login,body:{username:alan_1,password:123456,dev_id:6984654}}[2014-09-1014:32:45.320][ERROR]pomelo-[E:svnxjmhtrunksrcservergame-servernode_modulespomelolibserverserver.js]failtoforwardmessage:TypeError:CannotcallmethodforwardMessageofundefinedatdoForward(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibserverserver.js:334:50)atdispatch(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibserverserver.js:103:7)atnext(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibcommonservicefilterService.js:50:7)atService.beforeFilter(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibcommonservicefilterService.js:65:3)atbeforeFilter(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibserverserver.js:242:8)atpro.globalHandle(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibserverserver.js:112:3)atComponent.globalHandle(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibcomponentsserver.js:74:14)athandleMessage(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibcomponentsconnector.js:295:15)atnull.anonymous(E:svnxjmhtrunksrcservergame-servernode_modulespomelolibcomponentsconnector.js:239:5)atEventEmitter.emit(events.js:95:17)PomeloClub上有些说法是前端服务器将消息转发到其它服务器过程中出现问题,rpc失败。

或者可能是handler拼错。

博主检查发现在servers.json中普通server如果配置了frontend:true就会出现这个问题.尝试把frontend去掉或者改成false就正常了.

作者给您推荐的内容
  1. 1打开「开始」菜单中的[设置]。2单击[系统]图标。三。单击左侧的通知和Win10通知栏显示哪些图标设置教程操作,然后单击选择任务栏上显示的图标。4要显示的图标设置为[开],要隐藏的图标设置为...

  2. 在这里介绍在PR中添加转场特效的方法,希望本指南能帮到你。01、比如,现在PR的序列面板的视频轨道1中已有三段视频,接下来,给视频添加转场特效。02、在左侧的项目面板中调出效果面...

  3. 三星笔记本做系统三星笔记本WIN7系统32位下载系统支持Windows下一代全自动快速备份/恢复系统,维护简便无忧,采用微软官方原创WIN7系统精心制作,带来WinPE小型操作联想笔记本win10改...

  4. 现在有一些人使用微信的漂流瓶功能,那么用漂流瓶怎么交朋友呢?01、点开你的微信页面02、然后点击“发现”就会出现以下页面再点击“漂流瓶”03、点击“扔一个”04、如果你的声音特别好...

  5. coreldraw选中coreldraw是丰富的创造力和强大功能的完美结合。随着速度的大幅提高、更精确的颜色控制、增强的矢量插图工具和新的网络功能,该套件已成为所有设计师必不可少的工core...

  6. msi是什么电脑MSI笔记本电脑有几个版本的Ge,GS,GT,GX系列,为玩家提供更多的购买选择msi笔记本以其高性能的特点挤进了竞争激烈的电脑市场,并以其自身独特的特点被大多rog笔记本...

  7. 在这里介绍在PPT中设置音频播放的方法,希望本指南能帮到你。01、启动PPT后,新建空白幻灯片;鼠标再移到菜单栏这里点击“插入”选项卡。下面即展开了与之相关的内空。鼠标再移动界面的...

  8. 随着科学技术的发展怎么关闭手机钉钉中的好友推荐功能,手机已经成为人们日常生活中不可缺少的工具。当我们在手机上使用nail应用程序时,如果我们不喜欢朋友推荐功能,我们应该如何关闭它...

  9. 取消win7开机密码Win7系统启动登录主要是为了安全,一些网民的计算机信息更重要,有必要设置密码来保护信息的安全。但是普通家庭用户不需要设置,直接进入系统会更快。接下来我将...

  10. 余额宝有一个功能叫笔笔攒,也就是你消费一笔就会帮你冻结一笔消费的金额到余额宝,这样达到攒钱的目的,会帮你冻结起来,那冻结的钱怎么才能解冻取出来呢?01、登录支付宝后,点击右下角...