【问题标题】:problem in sending base64 data in GET request在 GET 请求中发送 base64 数据的问题
【发布时间】:2021-03-02 18:42:13
【问题描述】:

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

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

下面是代码

路由器.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)
     
    } 
})

【问题讨论】:

  • forEach 方法总是返回 undefined 所以awaiting 它的行为可能不符合您的预期。您可以使用fs.readdirfs.readFile 的承诺版本并在那里使用await 来修复它。
  • 嗨 Diego 尝试了你推荐的方法,但仍然遇到问题
  • 下面是我所做的更改: fs.promises.readdir(dir,function(err,files) fs.readFileAsync (filename , {encoding:'base64'} , (err,base64Data )
  • 我在 GET 请求之前添加了这个: const util = require('util'); fs.readFileAsync = util.promisify(fs.readFile);
  • 我无法从您发送的消息中知道您的代码是什么样的。但是,您是否也将await 添加到了 fs 相关的函数调用中。

标签: node.js fs async.js


【解决方案1】:

创建辅助函数并对其进行承诺总是好的,这样您就可以使用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);
    });
  });
}

我猜你用的是猫鼬。

有一个方法叫findOne,你也忘了用returnUser.save()保存你的模型

【讨论】:

  • @akhilmodi 好的。我不知道它是否会起作用,我只是把它写下来
猜你喜欢
  • 2016-08-04
  • 2017-10-21
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多