В настоящее время у меня есть фрагмент кода, который загружает файл в локальную файловую систему. Это довольно просто:NodeJS состояние гонки?
var downloadFile = function(request, file_name, cb) {
var final_path = file_name + '.pdf';
var file = fs.createWriteStream(final_path);
// Save temporary file to disk
var save_file = request.pipe(file);
save_file.on('finish', function() {
cb('success', final_path);
});
}
Однако, в некоторых случаях, я бы столкнуться с ошибкой (позже в коде), что свидетельствует о том, что файл не был полностью загружен. Когда я сам вручную открываю файл, он выглядит отлично. Кроме того, ошибка, как представляется, происходит чаще, когда у нас на сайте достаточно большое количество пользователей.
Все это наводит на мысль о возможном состоянии гонки, но я не совсем уверен, где и как это могло произойти. Мое понимание узла заключается в том, что он однопоточный с неблокирующимся вводом-выводом, который предполагает, что любые возможные виновники будут в частях ввода-вывода: createWriteStream и последующий канал (возможно, обработчик обратного вызова «finish»). Возможно, они каким-то образом переписываются или называются не по порядку. Но как? Обработчик отделки кажется стандартным обещанием/обратным вызовом. Любые идеи были бы очень признательны!
Эдвард
Вы пробовали слушать 'конец' событие save_file? –
Возможно, что обратный вызов завершен еще не был выполнен, в этот момент в коде, когда вы пытаетесь получить доступ к файлу (если это то, что вы делаете). Не могли бы вы также отправить код, который также дает ошибку? –
Функция cb ('success', final_path) содержит весь будущий код. Ничего не выполняется до тех пор, пока не будет достигнут обработчик «finish». Но может ли один пользователь вызвать обработчик финиша для файла save_file другого пользователя? (Так как это I/O, что потенциально может вызвать конфликты?) –