无法在 setTimeout 中将流发送到服务器

Posted

技术标签:

【中文标题】无法在 setTimeout 中将流发送到服务器【英文标题】:Can't send stream to the server in setTimeout 【发布时间】:2018-12-03 14:44:02 【问题描述】:

我一直在尝试将图像文件流(使用 createReadStream)上传到服务器(使用 Multer)。

我正在使用请求模块。

第一次发送请求时,一切正常。服务器接收流,对其进行处理并将其保存到文件中。

几秒钟后(使用 setTimeout),相同的文件流再次发送到服务器,但 multer 没有运行,客户端也没有收到任何响应。它一直在等待。

我在使用流时发现了该文件流。但是,我已将 autoClose 设置为 false。还是没有运气。

我也尝试将流保存在缓冲区中,然后将缓冲区上传到服务器但 multer 无法处理它,我得到一个空的 req.files 对象。

如果您能帮助我或给我一个方向,我将不胜感激。一个多星期以来,我一直在努力解决这个问题。

let formData = ;
formData.imageFile = fs.createReadStream('./file.jpg',  autoClose: false );

request.post( url: config.uploadURL, formData , (err, response, body) => 
      if (err) 
        return console.error('upload failed:', err);
      
      console.log('Received response');
    );

setTimeout(() => 

    request.post( url: config.uploadURL, formData, (err, response, body) => 
      if (err) 
        return console.error('upload failed:', err);
      
      console.log('Received response');
    );
  , 10000);

第一个请求完美运行。第二个没有。

【问题讨论】:

【参考方案1】:

这将起作用,实际上我们正在重新打开流。

const request = require('request');
const fs = require('fs');

function getFileStream(fileName) 
    return fs.createReadStream(fileName,  autoClose: true );


let formData =  imageFile: getFileStream('./file.jpg') ;

console.log('Uploading..');
request.post( url: config.uploadURL, formData , (err, response, body) => 
      if (err) 
        return console.error('upload failed:', err);
      
      console.log('Received response');
    );

setTimeout(() => 
    console.log('Uploading again..');
    formData =  imageFile: getFileStream('./file.jpg') ;
    request.post( url: config.uploadURL, formData, (err, response, body) => 
      if (err) 
        return console.error('upload failed:', err);
      
      console.log('Received response');
    );
  , 10000);

您也可以只将文件加载到内存中,完全避免使用流:

const request = require('request');
const fs = require('fs');

let formData = 
    imageFile: 
        value:  fs.readFileSync('./file.jpg'),
        options: 
          filename: 'file.jpg',
          contentType: 'image/jpeg'
        
    
;

console.log('Uploading..');
request.post( url: config.uploadURL, formData , (err, response, body) => 
      if (err) 
        return console.error('upload failed:', err);
      
      console.log('Received response');
    );

setTimeout(() => 
    console.log('Uploading again..');
    request.post( url: config.uploadURL, formData, (err, response, body) => 
      if (err) 
        return console.error('upload failed:', err);
      
      console.log('Received response');
    );
  , 10000);

【讨论】:

与我的代码集成后,您的代码也无法正常工作。但是,如果单独运行,它可以完美运行。有什么东西在搅乱一切。谢谢(我会尽快将答案标记为已完成) 我无法编辑上面的评论。您的两个代码都运行良好。有一些无用的代码。感谢您节省了我的时间。第二种选择更好。

以上是关于无法在 setTimeout 中将流发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何在邮递员中将数据作为@RequestPart 发送

在 C# 中将音频流添加到视频流

如何在 Express 4 中将承诺的收益结果作为流发送?

如何在授权标头中将带有 fetch 和 cors 的 JWT 令牌发送到 Express 服务器?

无法在Android中将变量值从一个活动发送到另一个活动

前端初学者笔记JavaScript的防抖/节流函数