akm
akm

Reputation: 169

problem in sending base64 data in GET request

Hi I am facing issues sending base64 data in GET request. I was successful in converting the image into base64 data and inserting it in receivedFile but during response the attachments come as an empty array while the rest of the data i.e user_id is flowing successfully.

Hence if you could please help me to resolve this issue.

Below is the code

router.js

router.get('/users/data/expand/:nid',async (req,res) => {
    var idselected = req.params.nid;
    var dir = '\images';
    var receivedFile = [];    
      try {
           const checkData = await user.find({"user_id": idselected});   
             
            await checkData[0].attachments.forEach (element => {
            
            fs.readdir(dir,function(err,files)  {
              
                if(err) {
                    console.log(err)
                }else {
                files.forEach((filename) => {
                    filename = element;
                    fs.readFile(filename,'base64', (err,base64Data) => {
                      if(err) {
                           console.log(err);  
                       }
                       
                      receivedFile.push(base64Data);
                       
                          
                    })
                })
                }
                
           })
          })
            //issue is here the attachments is coming as empty instead of base64 data 
            const returnUser = new User({
                    user_id: checkData.user_id,
                    attachments: receivedFile    
                })
          res.status(201).send(returnUser);
    }      
       catch(e) { 
      
        res.status(500).send(e)
     
    } 
})

Upvotes: 0

Views: 162

Answers (1)

Ilijanovic
Ilijanovic

Reputation: 14904

Well its always good to create helper functions and to promisfy it so you can use async / await syntax.

I have changed your code. I didnt tested it but i guess it should work:#

router.get("/users/data/expand/:nid", async (req, res) => {
  var idselected = req.params.nid;
  var dir = "images";
  try {
    const checkData = await user.findOne({ user_id: idselected });

    let receivedFile = await Promise.all(
      checkData.attachments.flatMap(async element => {
        let files = await readDirectory(dir);
        return await Promise.all(
          files.map(filename => {
            filename = element;
            return readFile(filename)
          })
        );
      })
    );
    const returnUser = new User({
      user_id: checkData.user_id,
      attachments: receivedFile
    });
    let savedUser = await returnUser.save();
    res.status(201).send(savedUser);
  } catch (e) {
    res.status(500).send(e);
  }
});

function readDirectory(dir) {
  return new Promise((res, rej) => {
    fs.readdir(dir, function(err, files) {
      if (err) {
        rej(err);
      } else {
        res(files);
      }
    });
  });
}

function readFile(filename) {
  return new Promise((res, rej) => {
    fs.readFile(filename, "base64", (err, base64Data) => {
      if (err) {
        rej(err);
      }
      res(base64Data);
    });
  });
}

I guess you use mongoose.

There is an method called findOne and also you forgot to save your model with returnUser.save()

Upvotes: 1

Related Questions