【问题标题】:How to solve write after end error in nodejs?如何解决nodejs中结束错误后的写入?
【发布时间】:2020-03-20 16:45:32
【问题描述】:

我正在尝试从 azure blob 存储下载多个文件。我有以下代码。

exports.fileDownload = (req,res,next) => {
   for(i=0;i<req.body.FileName.length;i++){
    downloadFileName1.push(req.body.FileName[i]);
    req.body.downloadFileName = downloadFileName1; 
    blobfilename1.push(req.body.Entity_ID + '/' + req.body.FileType + '/' + 
    req.body.FileName[i]);
    req.body.blobFileName = blobfilename1;
   }
     blobservice.getBlobDataToStream(req,res)
   }

------

const getBlobDataToStream = async function(req,res){
  for(var j=0;j<downloadNames.Length;j++){
     res.setHeader("Content-Disposition","attachment;filename=" + downloadNames[j]);
     res.setHeader("Content-Type","image/jpg");
     res.setHeader("Access-Control-Allow-Headers","X-Requested-With,content-type");
  }
  for(var k=0;k<blobF.Length;k++){
     getBlob(blobfilename[k]);
  }

function getBlob(blobFileNamee){
    blobService.getBlobToStream(storageName, blobFileNamee , res, function(error, result, response) 
   {
        console.log("------------------")
        if(error){
            console.log('error',error);
            res.send({error:error, status: false});
        }
        else{ 
            console.log('resp',result);
            resp = result; 
            res.end(); 

        }
     })
    } 
  }

有人可以帮我解决这个问题吗?我收到“结束后写入”错误。

【问题讨论】:

  • 发布整个代码,因为这似乎在快速路线内。虽然错误很明显,但是一旦你提交了整个代码,我就会给出答案,所以不会有误解。
  • @MarcosCasagrande 谢谢。我已经发布了..你能检查一下吗?
  • 您是否尝试在同一个请求中下载多个文件?
  • @MarcosCasagrande 是的..

标签: html node.js blob


【解决方案1】:

尝试异步处理。将你的回调包装成一个promise并解决或拒绝它。在你调用函数的for循环中,将函数设为await。

for(var k=0;k<blobF.Length;k++){
 await this.getBlob(blobfilename[k]);
}

static async getBlob(blobFileNamee){
 return new Promise((resolve,reject)=>{
 blobService.getBlobToStream(storageName, blobFileNamee , res, function(error,result, 
 response) 
{
    console.log("------------------")
    if(error){
        console.log('error',error);
        reject(error);
        res.send({error:error, status: false});
    }
    else{ 
        console.log('resp',result);
        resolve(result);
    }
 })
}
} 

【讨论】:

    【解决方案2】:

    问题是您要在每个 getBlob 中结束请求,每个请求都会发生多次。请求只能结束一次,这就是您收到该错误的原因。

    您遇到的另一个问题是您想在一个请求中发送多个文件,这在浏览器上不起作用。所以我的建议是压缩所有文件,只发送压缩文件。

    您可以使用 zipstream 和 blobService.createReadStream 之类的东西来代替 getBlobToStream

    【讨论】:

      猜你喜欢
      • 2016-04-27
      • 1970-01-01
      • 2017-01-08
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多