- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用各个 blob 的 url 下载存储在 azure blob 存储中的文件。
我正在下载五个 blob 文件,并且我确实有所有这些 blob 文件的单独 URL。
下面是我的代码:
function Download()
{
const fs = require('fs');
const path = require('path');
const https = require('https');
const url = require('url');
var sasToken = '?sv=2019-02-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2019-10-3xxxxxxxZ&sp=rl'
var blobUris = ['https:xxx', 'xxx', 'xxx', 'xxx', 'xxx'];
var i;
for(i=0; i<blobUris.length; i++)
{
var sasUrl = blobUris[i] + sasToken;
var filename=url.parse(blobUris[i]).pathname.split('/').pop();
var filePath = "D:/BLESensor"
var file = fs.createWriteStream(filePath+"/"+filename)
var request = https.get(sasUrl, function(response) {
response.pipe(file);
// Promise.resolve()
// .then(() => file.destroy())
// .catch(console.log)
});
}
}
return Download();
运行该函数时出现以下错误:
Error [ERR_STREAM_WRITE_AFTER_END]: write after end
at writeAfterEnd (_stream_writable.js:248:12)
at WriteStream.Writable.write (_stream_writable.js:296:5)
at IncomingMessage.ondata (_stream_readable.js:709:20)
at IncomingMessage.emit (events.js:198:13)
at IncomingMessage.Readable.read (_stream_readable.js:504:10)
at flow (_stream_readable.js:973:34)
at resume_ (_stream_readable.js:954:3)
at process._tickCallback (internal/process/next_tick.js:63:19)
Emitted 'error' event at:
at errorOrDestroy (internal/streams/destroy.js:107:12)
at WriteStream.onerror (_stream_readable.js:733:7)
at WriteStream.emit (events.js:203:15)
at errorOrDestroy (internal/streams/destroy.js:107:12)
at writeAfterEnd (_stream_writable.js:250:3)
at WriteStream.Writable.write (_stream_writable.js:296:5)
[... lines matching original stack trace ...]
at flow (_stream_readable.js:973:34)
如有任何建议,我们将不胜感激。谢谢!
最佳答案
这是因为我们在 for 循环中下载,而 https.get 调用(像所有 Node.js I/O 调用一样)是异步的。因此,在这种情况下,response.pipe 将无法使用函数范围的文件变量(例如 var file..)正常工作(因为文件流将在调用 response.pipe 时关闭)
这个问题有一个简单的修复方法,我们只需要确保文件变量是 block scoped ,例如使用 let或const为此。
function Download()
{
const fs = require('fs');
const path = require('path');
const https = require('https');
const url = require('url');
var sasToken = '?sv=2019-02-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2019-10-3xxxxxxxZ&sp=rl'
var blobUris = ['https:xxx', 'xxx', 'xxx', 'xxx', 'xxx'];
var i;
for(i=0; i<blobUris.length; i++)
{
var sasUrl = blobUris[i] + sasToken;
var filename=url.parse(blobUris[i]).pathname.split('/').pop();
var filePath = "D:/BLESensor"
// Make sure file variable is block scoped. We could use const too.. but not var!
let file = fs.createWriteStream(filePath+"/"+filename)
console.log("Downloading file: " + (i+1));
var request = https.get(sasUrl, function(response) {
response.pipe(file);
});
}
}
return Download();
关于javascript - 为什么我在下载文件时收到错误 "Error [ERR_STREAM_WRITE_AFTER_END]: write after end"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58619903/
代码说明:当用户访问特定的 url 时,我返回特定的 HTML 文件: const http = require('http'); const fs = require('fs'); fs.readF
我正在尝试使用各个 blob 的 url 下载存储在 azure blob 存储中的文件。 我正在下载五个 blob 文件,并且我确实有所有这些 blob 文件的单独 URL。 下面是我的代码: fu
我一直使用 react-native-cli 或 Expo 构建 React Native 项目。 我刚刚克隆了这个包含 gradle 的 React Native 项目,我正在按照 scripts
所以我想做的是,我只是在 Formidable Module 的帮助下使用 nodeJS 将文件上传到特定文件夹,使用以下引用。 File Upload using nodeJS 现在,我的文件已上传
当我从 ui 中点击上传文件 api 时,我遇到了一个问题,如下所示。我从 React JS 中访问 Node JS API,然后从 Node JS 中访问公共(public) API。 node v
对于每个请求,我都试图解密加密图像,并基于此提供响应。我启动了我的服务器,在第一个请求时,它解密文件,并发送一个正确的响应,而在下一个请求时,它尝试解密,但没有将任何数据存储到新文件中,最后抛出错误“
在我的服务器端,我有套接字服务器在监听,在我自己的笔记本电脑上,我有 socket.io-client 服务,只要我打开它们,它们就会连接。 当其他人向我的服务器发出请求时,服务器通过套接字将该请求发
我是一名优秀的程序员,十分优秀!