Hai, saya menghadapi masalah dalam mengirim data base64 dalam permintaan GET. Saya berhasil mengonversi gambar menjadi data base64 dan memasukkannya ke receivedFile tetapi selama respons, lampiran datang sebagai larik kosong sementara sisa data yaitu user_id berhasil mengalir.

Oleh karena itu jika Anda bisa tolong bantu saya untuk menyelesaikan masalah ini.

Di bawah ini adalah kode

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)
     
    } 
})
0
akhil modi 19 November 2020, 14:43

1 menjawab

Jawaban Terbaik

Baik itu selalu baik untuk membuat fungsi pembantu dan menjanjikannya sehingga Anda dapat menggunakan sintaks async / await.

Saya telah mengubah kode Anda. Saya tidak mengujinya tetapi saya kira itu akan berhasil:#

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);
    });
  });
}

Saya kira Anda menggunakan luwak.

Ada metode yang disebut findOne dan Anda juga lupa menyimpan model Anda dengan returnUser.save()

1
Ifaruki 19 November 2020, 14:27