Попытка загрузить файл в цикле с помощью node.js, но, похоже, возникают некоторые проблемы с синхронизацией - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать простую программу в node.js, которая будет загружать один и тот же файл с некоторым интервалом. Если загруженный файл более новый, чем предыдущий, он будет сохранен в новом имени файла с помощью счетчика.

Если это новый файл, то я хочу сохранить его под именем last_unique.jpgи используйте его для сравнения в следующий раз, когда файл будет загружен. Но это не похоже на работу. Для теста у меня просто есть пустой файл last_unique.jpg, который я ожидаю перезаписать. Но это никогда не происходит, поэтому каждый раз, когда jpg-файл загружается, он уникален и сохраняет его в file3.jpg, file3.jpg и т. Д.

Однако вывод также выглядит как некоторые асинхронные проблемы? Он пропускает первые пару раз.

ВЫХОД:

downloading 1
downloading 2
downloading 3
Unique file spotted!
downloading 4
Unique file spotted!
downloading 5
Unique file spotted!
downloading 6
Unique file spotted!
downloading 7
Unique file spotted!
downloading 8
Unique file spotted!

Вот код:

const http = require('http');
const fs = require('fs');
const md5File = require('md5-file');
const fileToDownload = "http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg";
var counter = 0;

function request() {
        counter = counter + 1
        console.log("downloading " + counter);
        const save = fs.createWriteStream("last_download.jpg");

        http.get(fileToDownload, function(response) {
                response.pipe(save)
        });

        const hash1 = md5File.sync('last_download.jpg');
        const hash2 = md5File.sync('last_unique.jpg');

        // it is a new file
        if (hash1.localeCompare(hash2) != 0) {
                console.log('Unique file spotted!');
                fs.copyFileSync('last_download.jpg','last_unique.jpg');
                fs.copyFileSync('last_unique.jpg','file' + counter + '.jpg');
        }
}

setInterval(request, 3000);

1 Ответ

1 голос
/ 24 октября 2019
const http = require('http');
const fs = require('fs');
const md5File = require('md5-file');
const fileToDownload = "http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg";
var counter = 0;

function request() {
    counter = counter + 1;
    console.log("downloading " + counter);
    const save = fs.createWriteStream("last_download.jpg");

    http.get(fileToDownload, function(response) {
        response.pipe(save);
        response.on('end',function () {
            save.end();

        })
    });


    save.on('finish',function () {

        const hash1 = md5File.sync('last_download.jpg');
        const hash2 = md5File.sync('last_unique.jpg');

        console.log(hash1,hash2);
        // it is a new file
        if (hash1.localeCompare(hash2) != 0) {
            console.log('Unique file spotted!');
            fs.copyFileSync('last_download.jpg','last_unique.jpg');
            fs.copyFileSync('last_unique.jpg','file' + counter + '.jpg');
        }

    });



}

setInterval(request, 3000);

Вам необходимо прослушать событие финиша в потоке, в противном случае вы можете вызвать функцию копирования до того, как поток будет полностью записан. Следовательно, частичное изображение копируется из last_download.jpg в last_unique.jpg , что означает, что хэши будут другими. Это связано с асинхронным характером копирования и HTTP-запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...