My use case is such where I have to create a directory of files and return it as a zip file for the user.
My code looks like this:
var output = fs.createWriteStream('target.zip'); archive.pipe(output); archive.append('details.json', { name: 'details.json'}); archive.finalize(); //Specifiy the .zip folder & Download filename = 'target.zip'; res.download(filename);
This gives me an empty folder in my browser's download location.
The target.zip
in its server's location however, contains data.
I realize this is happening because Node is not waiting for append()
to append files to the archive.
I tried to put the code for download in the callback function of append.finalize()
but it doesn't work.
Where do I put the download code so that it happens after the append is successful?
Just have a look at their Example on their GitHub repository.
You can set the Attachment
property on res
and then pipe to it.
//set the archive name res.attachment('archive-name.zip'); //this is the streaming magic archive.pipe(res);
You must also monitor res's on 'close' to be able to end the stream when everything is done.
res.on('close', function() { console.log('Archive wrote %d bytes', archive.pointer()); return res.status(200).send('OK').end(); });
That way you can still finalize, but the download will only occur once everything is done.