Контрольная сумма CRC32 не вычисляется в node.js

Я пишу node.js сервер, на котором я принимаю файл вместе с контрольной суммой CRC32 в составном запросе. Я использую модули узлов busboy и crc для обработки составных запросов и операций CRC в узле.

В событии finish busboy я пытаюсь вычислить контрольную сумму CRC32 сохраненного файла и проверить ее по полученной контрольной сумме.

Моя проблема в том, что в событии finish контрольная сумма всегда вычисляется как 0. Если я вручную запускаю контрольную сумму CRC32 для того же файла, контрольная сумма вычисляется правильно.

Вот фрагмент кода, который я использую для обработки многостраничного запроса с вычислением crc32:

var busboy = new Busboy({ headers : request.headers});
var saveTo;
var crc32;
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
    saveTo = path.join('files', '/', filename);
    file.pipe(fs.createWriteStream(saveTo));
});

busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated) {
    if(fieldname == 'checksum') {
        crc32 = val;
    }
});

busboy.on('finish', function() {
    var savedFileCrc32 = crc.crc32(fs.readFileSync(saveTo)).toString(16);
    console.log("CRC32 of saved file: " + savedFileCrc32 + " file: " + saveTo);
});
request.pipe(busboy);

Моя консоль всегда печатает CRC32 of saved file: 0 file: files/image.jpg

Однако, если я запускаю программу узла для вычисления контрольной суммы CRC32 только что созданного файла, она работает отлично и выводит контрольную сумму.

Изображение также сохраняется должным образом. В событии finish, если я открываю поток чтения onsaveTo и считываю байты, изображение считывается, поэтому файл уже существует.

Есть идеи, в чем может быть проблема?


person Vinay S Shenoy    schedule 26.02.2015    source источник
comment
если busboy передает запись в поток fs, знает ли он, когда он закончил запись?   -  person dandavis    schedule 26.02.2015
comment
Я не уверена. Я думаю, что @tgo прав. Я собираюсь попробовать записать файл синхронно и проверить, решает ли это проблему.   -  person Vinay S Shenoy    schedule 26.02.2015


Ответы (1)


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

Мне также интересно, не является ли это на самом деле дубликатом этого.

person tgo    schedule 26.02.2015
comment
Хм .. Хороший момент. Позвольте мне попробовать записать файл синхронно и посмотреть, не изменится ли это. - person Vinay S Shenoy; 26.02.2015
comment
Именно это и происходило. Вместо этого я использовал multiparty для синтаксического анализа запроса Multipart, который сохраняет файлы напрямую во временную память и только после этого дает мне последний обратный вызов. Спасибо! - person Vinay S Shenoy; 27.02.2015