Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

115
Views
how to get callback of collection.each{fn} discord.js

I want to make a discord bot that should get all image attachements and merge them into 1 pdf.

I have divided my problem into 2 steps, downloading and converting to pdf.

I've been successful at downloading and converting 1 image, using callbacks on the download function.

But now I want to download multiples images that will then be merged in to 1 pdf. I can't make a callback for every image I download because I want to wait until all the images are downloaded to merge them.

(I name images according to their number to make it easier for me to identify them at the merging process).

Here is my code:

client.on('messageCreate', msg => {
  if (msg.author.bot) return;
  
  file_number = 0

  var attachments = msg.attachments
  attachments_size = attachments.size

  attachments.each(attachment => {
    var url = attachment ? attachment.url : null;
    file_number += 1
    file_name = file_number + '.jpeg'
    download(url, file_name, function(){
    })


  })

  
  convert_merge()
  

});


var download = function(uri, filename, callback){
  request.head(uri, function(err, res, body){
    request(uri).pipe(fs.createWriteStream('./files/'+ filename)).on('close', callback);
  });
};



var convert_merge = function(callback){

  var doc = new PDFDocument
  var doc_width = doc.page.height
  var doc_height = doc.page.width
 
  var writeStream = fs.createWriteStream('./files/merged.pdf')
  doc.pipe(writeStream)
  doc.rotate(90, {origin: [doc_width/2, doc_height/2]});

  
  doc.image('./files/'+ `1.jpeg`, {
   fit: [doc_width+25, doc_height+35],
   align: 'center',
   valign: 'center'
  });

  

  for (var i = 1; i <= file_number ; ++i) {
    
    doc.addPage()
     .image('./files/'+ i + `.jpeg`, {
     fit: [doc_width+25, doc_height+35],
     align: 'center',
     valign: 'center'
    });
    
  }
  
  doc.end()

};

This is the error i have:

node:internal/fs/utils:344
    throw err;
    ^

Error: ENOENT: no such file or directory, open './files/1.jpeg'

This means that 1.jpeg doesn't exist yet, this can only mean that convert_merge is firing before attachments.each{} finishes

This makes me question 2 things:

  1. Why is JavaScript firing the convert function before the attachement.each call ?
  2. Is there a callback for the attachement.each call ?

Finally, how should I go over this problem? I have thought of checking if last file of the attachment exists before starting the conversion but I was unsuccessful and it seemed not to be the right way to go.

Looking for any advice

Feel free to ask for anything

Thanks in advance for your help :)

about 4 years ago · Juan Pablo Isaza
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!