Search code examples
javascriptnode.jsnode-modulesnode-https

How to reset forEach() function if statement is matched


const downloadurl = ['url1', 'url2']
const filename = 'run.jar'

downloadurl.forEach((urls) => {
    https.get(urls, (httpsres) => {
        const path = `${installationdirectory}/${filename}`
        const filePath = fs.createWriteStream(path);
        httpsres.pipe(filePath);
        filePath.on('finish',() => {

            filePath.close();
            const filesize = fs.statSync(path).size
            // Verify if the size of the file is smaller than 1Kb
            if((filesize / 1024) < 1) return;

            // Want to skip this console.log if the file size is smaller than 1Kb and try with the other downloadurl (Hence why the downloadurl.forEach)
            console.log('File downloaded!'); 


        })
    })
})

I'm using the https module from NodeJS which doesn't give an error if the download url doesn't exist, as it just creates a 1-byte file with the run.jar name instead. So, I want to make it stop executing code and try to download with the other URL if the size of the file is smaller than 1Kb, any ideas?


Solution

  • Used @Matt's comment as it was the simplest one to implement (And I didn't know that the HTTPS module does have a response to check the status code).

    const downloadurl = ['url1', 'url2']
    const filename = 'run.jar'
    
    downloadurl.forEach((urls) => {
        https.get(urls, (httpsres) => {
            if(httpsres.statusCode !== 200) {
                return console.log(`Attempt of downloading failed with ${httpsres.statusCode} error! Retrying with another download URL`);
            } else {
    
            const path = `${installationdirectory}/${filename}`
            const filePath = fs.createWriteStream(path);
            httpsres.pipe(filePath);
            filePath.on('finish',() => {
    
                filePath.close();
                const filesize = fs.statSync(path).size
                // Verify if the size of the file is smaller than 1Kb
                if((filesize / 1024) < 1) return;
    
                // Want to skip this console.log if the file size is smaller than 1Kb and try with the other downloadurl (Hence why the downloadurl.forEach)
                console.log('File downloaded!'); 
    
            })
            }
        })
    })