报错:
fs.js:77
throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs
^
Error: EBADF, write
at Error (native)
首先是 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 。
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 来无视它。
// ...
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)
at ChildProcess.emit (events.js:129:20)
at maybeClose (child_process.js:1015:16)
at Socket.<anonymous> (child_process.js:1183:11)
at Socket.emit (events.js:107:17)
at Pipe.close (net.js:485:12)
解决方案:看错误栈去改代码就好了。。
原文地址: http://www.lellansin.com/node-js-error-ebadf-write.html
回复 (0)
暂无回复,成为第一个参与讨论的人。
参与回复
登录后即可参与回复。登录