记录几个node.js错误及解决方案

时间:2016.04.30 发布人:lyp0000

记录几个node.js错误及解决方案

已解决问题

谷歌lyp0000用户在2016.04.30提交了关于“替天行盗记录几个node.js错误及解决方案”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-04-06T01:13:31。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,没有什么华丽的语言,但是我对你的感谢不会减少 !

希望以下的回答,能够帮助你。

第1个回答

用户名:vtvbz  

个node.js错误及解决办法整理如下

node.jsError:EBADF,write

最近工作写了个小项目,本以为能好好喝下茶,可是让人想掀桌的报错出现了。

fs.js:77
throwerr;//Forgotacallbackbutdon'tknowwhere?UseNODE_DEBUG=fs
^
括器解阻Error:EBADF,write
atError(native)

WTF?!fs.js:77?这是要我去多气鱼香酸轮看内核源代码?好在项目还来自不大,拆拆更健康。花了半天的时间之后问答大概是清楚了。

首先是Error笑每听仅该年面乎的名字EBADF其意义是badfiledescriptor错误的文件描述符。
而Error:EBADF,write表示往错误的文件描述符里面写数据了。

出现这个BUG的场景简而言之,是有一个.on('化兵款data')事件拿到**往fd里面写,这个时候某个操作抛了er广木市获ror我在处理error的时候close了这个fd,而另外一边去还在触发data事件想往这个(已经被我close的)fd里面写**。如下:

//

varfd=律台为续张千行fs.openSync(p包密该波农明司抗末地ath,'w');

test.on('data',function(data){
fs.write(fd,dat费务资击最心令a);
});

test.on('end',function(){
f大林重s.close(fd);
});

//在end之前close就会出现Error:EBADF,write
setTimeout(fu练另立顶和何nction(){
fs.close(fd);
},10);

//

解决方案:所以我们排查际停慢究好出现fs.close具镇认沿叫湖负关闭文件描述符的地方,确保close之后不会再有r杨ead/write。


Error:EBADF,close

另外附上在谷歌的过程中看到了另外一个类似的错误。这是当你为多种情况做fs.close(fd);的处理,然而不幸的是,多个情况被都触发,fs.close讨员旧烈(fd)调用了多遍,同样也会出现EBADF错误。这样就能出现:

test.on('end',function(){
fs.close(fd);
fs.cl需ose(fd);//多报茶布伟黑委混调用了一次就会出现
});

不友好的报错


fs.js:77
throwerr;//该Forgotacallbackbutdon'tknowwhere?UseNODE_DEBUG=fs
^
Error:EBADF,close
atError(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:552
varr=***.read(fd,buffer,offset,length,position);
^
Error:EBADF,badfiledescriptor
atError(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*1024
killSignal:'SIGTERM'
},function(err,stdout,stderr){
console.log(stdout);
});

或者是用spawn的.on('data')事件触发时,手动拼接**到.on('close')事件触发的时候获得完整**。


pomeloCannotcallmethod'forwardMessage'ofundefined

报错信息:
[2014-09-1014:32:45.315][DEBUG]pomelo-[E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibcomponents
connector.js][connector-server-1]handleMessagesessionid:1,msg:{"id":10,"type":0,"compressRoute":0,"route":"user.u
serh**andler.login","body":"{username:'alan_1',password:'123456',dev_id:'6984654'}"}
[2014-09-1014:32:45.320][ERROR]pomelo-[E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibserverserv
er.js]failtoforwardmessage:TypeError:Cannotcallmethod'forwardMessage'ofundefined
atdoForward(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibserverserver.js:334:50)
atdispatch(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibserverserver.js:103:7)
atnext(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibcommonservicefilterService.js:50:7)
atService.beforeFilter(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibcommonservicefilterServi
ce.js:65:3)
atbeforeFilter(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibserverserver.js:242:8)
atpro.globalh**andle(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibserverserver.js:112:3)
atComponent.globalh**andle(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibcomponentsserver.js:74:
14)
athandleMessage(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibcomponentsconnector.js:295:15)
at**ll.<anonymous>(E:svnxjmhtrunksrcservergame-servernode_mo**lespomelolibcomponentsconnector.js:239:5)

atEventEmitter.emit(events.js:95:17)

PomeloClub上有些说法是前端服务器将消息转发到其它服务器过程**现问题,rpc失败。或者可能是handler拼错。
博主检查发现在servers.json中普通server如果配置了"frontend":true就会出现这个问题.尝试把frontend去掉或者改成false就正常了.