无法在 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 中将流发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章