[node.js]sourceを修正して再Compile

前の記事でも悩まされていた下記Error. Browserを立ち上げて最初にAccessしたときになるみたい。

events.js:45
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: EBADF, Bad file descriptor

環境はCentOS 5.6 64bit, node.js v0.4.8, Express v0.7.7, socket.io v0.6.18

Google Chrome + Inspectorを使ってDebugするとErrorになった箇所をみることができる。InspectorのInstallの仕方は前の記事を参考に。

Inspectorの機能でTraceすると、fs.jsの
ReadStream.prototype.destroy.close
を実行するときにErrorになっているみたい。

image

fs.jsやevents.jsはcompileして組み込まれているみたいなので、これを回避するためにsourceを修正して再Compileしてみた。

すでにnvmがinstallされている前提

Errorになっていた箇所を分岐して回避
# cd ./.nvm/src/node-v0.4.8
# make clean
# make distclean
# vi lib/fs.js

if (cb) cb(err);
if (err.code != 'EBADF') {
  self.emit('error', err);
)
return;

これでRebuild. そのままmakeしても出来たかもしれない。

# cd ..
# rm -f node-v0.4.8.tar.gz
# tar czvf node-v0.4.8.tar.gz node-v0.4.8/
# rm -rf node-v0.4.8
# cd ..
# rm -rf v0.4.8
# cp v0.4.5 v0.4.8
# cd
# nvm install v0.4.8

node-inspectorとnode-devもinstallし直し。
# npm install -g node-inspector node-dev

これで一応Errorは出なくなったけど、この修正が正しいかどうかは分からない。node.jsがVersion up すれば直っていると思う。

< Modified >
後で気付いたけど、alias使ってSubDirectoryに公開していると起こる。socket.ioがBackgroundでWebSocketMain.swfとかにAccessするときに404 not foundになっているのが原因じゃないかな?

io.SocketをInstance化するときにParameterを渡すと回避することも可能みたい(詳しくはSourceを読む)。

 

< Related Posts >

ApacheのReverse Proxyで502 Proxy Errorが出力される
[node.js]express-mvc-bootstrap + socket.io
[node.js]node-inspectorを使ってdebugする(express-mvc-bootstrap)