Node.js: EBADF, плохой дескриптор файла
Если я перезагружаю свое приложение (из браузера с помощью кнопки перезагрузки), 50 reload/10 seconds
это дает мне эту ошибку:
events.js:45
throw arguments[1]; // Unhandled 'error' event
^
Error: EBADF, Bad file descriptor
Мне кажется, что это ошибка пропускной способности или что-то в этом роде. Первоначально у меня была ошибка при воспроизведении с помощью HTML 5 Audio API, и если я загружал аудиофайл 10-15 раз последовательно, то я получал ошибку, но теперь я обнаружил, что я получаю ошибку и без Audio API, просто перезагружая сайт много раз, также Safari выдает ошибку намного быстрее, чем Chrome (WTF?)
Я использую Node.js 0.4.8 с express
+ jade
и я также подключен к базе данных MySQL с db-mysql
модуль.
Я не могу найти в Интернете никаких статей на эту тему, что может помочь, поэтому, пожалуйста, дайте мне знать, что может вызвать эту ошибку, потому что это действительно сбивает с толку:(
3 ответа
Под "перезагрузкой приложения" вы подразумеваете обновление домашней страницы приложения из браузера или фактически остановку и перезапуск процесса сервера node.js? Я предполагаю первое, и в этом случае, если вы не можете надежно воспроизвести это, отладку будет довольно сложно, тем более что у вас нет хорошей трассировки стека для точного определения источника. Но если вы используете express.js app.error
hook ( документы здесь), вы захотите записать путь ошибки из ошибки "Bad file descriptor", которая, надо надеяться, подскажет вам, является ли это временный файл, который был удален или что. С точки зрения фактической причины, мы можем предложить только предположения, так как "Плохой дескриптор файла" является очень общей ошибкой низкого уровня, которая в основном означает, что вы вызываете операцию с файловым дескриптором, который больше не находится в правильном состоянии для обработки этой операции (например, чтение закрытого файла, открытие удаленного файла и т. д.).
Эта ошибка может возникнуть в результате использованияfs
для сохранения файла, имя которого является числом , а не строкой . Имена файлов должны быть строками:
Неправильно:
const fileName = 12345;
const fileContent = "The great croissant."
fs.writeFileSync(fileName, fileContent);
Правильный:
fs.writeFileSync(`${fileName}`, fileContent);
Также правильно:
const fileName = "12345";
fs.writeFileSync(fileName, fileContent);
@CIRK, взгляните на это: https://github.com/joyent/node/issues/1189
это не проблема узла, а проблема настройки системы.
изменить: или, возможно, это связано с этой ошибкой в Connect 1.4.3: https://github.com/senchalabs/connect/issues/297
если это ваш случай, просто попробуйте обновить его