在 GET 请求中发送 base64 数据的问题

problem in sending base64 data in GET request

您好,我在 GET 请求中发送 base64 数据时遇到问题。 我成功地将图像转换为 base64 数据并将其插入 receivedFile 但在响应期间,附件作为一个空数组出现,而其余数据即 user_id 正在成功流动。

因此,如果你能帮我解决这个问题。

代码如下

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

创建辅助函数并承诺它总是好的,这样您就可以使用 async / await 语法。

我已经更改了您的代码。我没有测试它,但我想它应该可以工作:#

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

我猜你用的是 mongoose。

有一个方法叫做 findOne 而且你忘记用 returnUser.save()

保存你的模型