使用 webdav 在节点 js 中迭代 createreadstream 下载空文件
Posted
技术标签:
【中文标题】使用 webdav 在节点 js 中迭代 createreadstream 下载空文件【英文标题】:iteration over createreadstream in node js using webdav downloads empty files 【发布时间】:2021-01-06 01:06:55 【问题描述】:我正在尝试使用 webdav 从 nextcloud 上的文件夹下载一些文件。 我想遍历文件夹并下载其中的所有文件,这是我的代码:
let dir = "/foo"
let folder = await WebDav.getDirectoryContents("bar")
文件夹以数组形式返回
for (let i = 0; i < folder.length; i++)
await WebDav.createReadStream(folder[0].filename).pipe(
fs.createWriteStream(`$dir/$folder[0].basename`)
);
);
这些文件是用正确的名称创建的,但其中没有内容,并且它们的大小为零 KBs
但是当我将管道放在 for 循环之外时,它可以正常工作并下载文件。
【问题讨论】:
您正在尝试await xxx.pipe()
,但.pipe()
没有返回承诺,因此await
将无用。通常,流不直接与 Promise 一起使用。流没有内置对 Promise 的支持。您必须自己包装它们并将各种事件处理程序连接到一个承诺。或使用stream.pipeline()
并承诺。零大小是因为您的 for
循环在文件写入之前完成,因此您可能试图在文件写入之前使用它们,因为 await
没有任何用处。
【参考方案1】:
使用此代码,它对我有用
let fs = require('fs');
let createClient = require("webdav");
let start = async () =>
let client = createClient(
"https://*/on/demandware.servlet/webdav/Sites/Logs",
username: "*",
password: "*"
);
let directories = await client
.getDirectoryContents("/");
let files = await directories;
//console.log(files);
for(let i =0; i< files.length ; i++)
let fileName = files[i].filename;
if(fileName.includes('.log'))
let readStream = client.createReadStream(fileName);
// wait for 5 seconds, then pipe
setTimeout(function()
let writeStream = readStream.pipe(fs.createWriteStream("C:/Users/*"+ fileName));
writeStream.on('finish', function()
console.log('all done!');
);
writeStream.on('error', function(err)
console.error(err);
);
, 5000);
start();
【讨论】:
以上是关于使用 webdav 在节点 js 中迭代 createreadstream 下载空文件的主要内容,如果未能解决你的问题,请参考以下文章