【问题标题】:iteration over createreadstream in node js using webdav downloads empty files使用 webdav 在节点 js 中迭代 createreadstream 下载空文件
【发布时间】: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 没有任何用处。

标签: javascript node.js webdav nextcloud


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多