使用 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 下载空文件的主要内容,如果未能解决你的问题,请参考以下文章

Nginx WebDAV 模块忽略 CORS 标头

js中的DOM操作汇总

回调不是使用节点 js 的异步模块的 mongodb 查询中的函数

jQuery 自学笔记

jQuery 自学笔记

无法使用 IIS 7 设置 WebDAV