2014-09-16 3 views
1

В настоящее время у меня есть фрагмент кода, который загружает файл в локальную файловую систему. Это довольно просто: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»). Возможно, они каким-то образом переписываются или называются не по порядку. Но как? Обработчик отделки кажется стандартным обещанием/обратным вызовом. Любые идеи были бы очень признательны!

Эдвард

+0

Вы пробовали слушать 'конец' событие save_file? –

+1

Возможно, что обратный вызов завершен еще не был выполнен, в этот момент в коде, когда вы пытаетесь получить доступ к файлу (если это то, что вы делаете). Не могли бы вы также отправить код, который также дает ошибку? –

+0

Функция cb ('success', final_path) содержит весь будущий код. Ничего не выполняется до тех пор, пока не будет достигнут обработчик «finish». Но может ли один пользователь вызвать обработчик финиша для файла save_file другого пользователя? (Так как это I/O, что потенциально может вызвать конфликты?) –

ответ

-1

Попробуйте это:

var downloadFile = function(request, file_name, cb) { 
    var final_path = file_name + '.pdf'; 
    var file = fs.createWriteStream(final_path); 

    // Save temporary file to disk 
    request.pipe(file); 

    request.on('end', function() { 
    cb('success', final_path); 
    }); 
} 
+0

Я читал на разных сообщениях Stackoverflow (http://stackoverflow.com/questions/11447872/callback-to-handle-completion-of-pipe и http://stackoverflow.com/questions/15462086/node-js-v0- 10-stream2-api-pipe-end-event), которые, похоже, путаются относительно того, использовать ли «конец», «финиш» или «закрыть». Глядя на документы узла (http://nodejs.org/api/stream.html#stream_event_finish), похоже, что в настоящий момент закончен путь. –

+0

Здесь мы обращаемся к запросу, поэтому в этом случае мы будем использовать «конец». – Vickrant

+0

Кажется, теперь все работает нормально. Благодарю. –

Смежные вопросы