幾個node.js錯誤及解決辦法整理如下
node.js Error: EBADF, write
最近工作寫了個小項目,本以為能好好喝下茶,可是讓人想掀桌的報錯出現了。
fs.js:77
throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs
^
Error: EBADF, write
at Error (native)
WTF?! fs.js: 77? 這是要我去看內核源代碼?好在項目還不大,拆拆更健康?;税胩斓臅r間之后大概是清楚了。
首先是 Error 的名字 EBADF 其意義是 bad file descriptor 錯誤的文件描述符。
而 Error: EBADF, write 表示往錯誤的文件描述符里面寫數據了。
出現這個BUG的場景簡而言之,是有一個 .on('data') 事件拿到數據往 fd 里面寫,這個時候某個操作拋了 error 我在處理error 的時候 close 了這個 fd,而另外一邊去還在觸發 data 事件想往這個(已經被我 close 的)fd里面寫數據。如下:
// ...
var fd = fs.openSync(path, 'w');
test.on('data', function(data) {
fs.write(fd, data);
});
test.on('end', function() {
fs.close(fd);
});
// 在 end 之前 close 就會出現 Error: EBADF, write
setTimeout(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:77
throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs
^
Error: EBADF, close
at Error (native)
解決方案:依舊是排查 fs.close,只不過這次是要保證多種處理不會反復執行 fs.close ,或者你可以使用 try/catch 來無視它。
Error: EBADF, bad file descriptor
最后,當 fd 失效以后進行 read 操作的話,我還以為會出現 Error: EBADF, read 結果并沒有。以下是嘗試出現BUG的代碼:
// ...
fs.closeSync(fd);
fs.readSync(fd, new Buffer(1024), 0, 1024);
// ...
不過這個報錯會友好很多,有將其調用棧打出來。
fs.js:552
var r = binding.read(fd, buffer, offset, length, position);
^
Error: EBADF, bad file descriptor
at Error (native)
at Object.fs.readSync (fs.js:552:19)
at command.<anonymous> (/Users/Lellansin/Documents/workspace/node/test-server/app/services/TestService.js:40:6)
at command.emit (events.js:110:17)
新聞熱點
疑難解答