Javascript 列出OneDrive目录内容而不递归到子目录

Javascript 列出OneDrive目录内容而不递归到子目录,javascript,node.js,recursion,onedrive,Javascript,Node.js,Recursion,Onedrive,由于微软在那个时候正在赠送+,而且我已经有了几年的GBs免费空间,所以我打算将这个空间用作从VPS下载文件的媒体存储目录 因此,我开始阅读使用Node.JS对自己进行身份验证的文档,并成功地完成了这项工作 我能够: 随时登录和访问(使用访问令牌和刷新令牌) 上载、编辑、删除文件 创建、编辑、删除目录 列出目录内容 所有这些都是通过使用RESTAPI实现的 问题在于,由于对这些OneDrive REST API进行了一些重新编写,我必须循环遍历目录以检测其内容(根据文件夹的深度进行N次调用)

由于微软在那个时候正在赠送+,而且我已经有了几年的GBs免费空间,所以我打算将这个空间用作从VPS下载文件的媒体存储目录

因此,我开始阅读使用
Node.JS
对自己进行身份验证的文档,并成功地完成了这项工作

我能够:

  • 随时登录和访问(使用访问令牌和刷新令牌)
  • 上载、编辑、删除文件
  • 创建、编辑、删除目录
  • 列出目录内容
所有这些都是通过使用RESTAPI实现的

问题在于,由于对这些OneDrive REST API进行了一些重新编写,我必须循环遍历目录以检测其内容(根据文件夹的深度进行N次调用),而不是一次请求所需的目录

我只是想为OneDrive开发一个类似于ls的命令,以完成我的VPS OneDrive同步项目

这是我目前的代码:

function lsdir(path, originalpath, folder, callback) {
    dirs = path.split("/");
    if (folder == null) {
        originalpath = path;
        request("https://apis.live.net/v5.0/me/skydrive?access_token=" + at, function(err, res, body) {
            var json = JSON.parse(body);
            var upload_location = json.upload_location;

            request(upload_location + "?access_token=" + at, function(err, res, body) {
                //console.log(body);
                json = JSON.parse(body);
                var found = false;
                if (originalpath == "/") {
                    callback(json, originalpath);
                    return;
                }
                for (i in json.data) {
                    currentFolder = json.data[i];

                    if (currentFolder.name == dirs[1]) {
                        found = currentFolder;
                        if (dirs.length > 2) {
                            lsdir(dirs.slice(2, dirs.length).join("/"), originalpath, currentFolder, callback);
                        } else {
                            callback(currentFolder, originalpath);
                            return;
                        }
                        break;
                    }
                }
            });
        });
    } else if (dirs.length > 0) {
        request(folder.upload_location + "/?access_token=" + at, function(err, res, body) {
            json = JSON.parse(body);
            var found = false;
            if (dirs.length == 1) {
                callback(json, originalpath);
            } else {
                for (i in json.data) {
                    currentFolder = json.data[i];

                    if (currentFolder.name == dirs[0]) {
                        lsdir(dirs.slice(1, dirs.length).join("/"), originalpath, currentFolder, callback);
                        break;
                    }
                }
            }

        });
    }
}

有没有办法减少递归(或完全删除它)?Micro$ft服务器速度非常慢(每个请求3-5秒!)


谢谢大家,享受215GB的ONEDRIVE:(

< P>)你可能想考虑使用我们刚刚发布的API,它有能力做同步.< /P>


如果从要开始遍历层次结构的点开始同步操作,但不提供令牌,则它应返回完整视图。对于更大的层次结构,您仍然需要发出多个请求(基于“@changes.hasMorechanges”和“@odata.nextLink”的值),但这仍然远远少于每个文件夹一个请求。

Awesome!我会看一看,努力达到我的目标。谢谢你,布拉德!最后,API相对于路径。你保存了我的递归(当然还有你的带宽:P),你的API有什么问题吗?当收到错误时,JSON是格式化的,否则就不是了(在用JSON.parse(string)解析时会给我带来问题),你能检查一下吗?有趣的是,我们的格式不一致,我将对此进行研究。然而,两者似乎都是有效的JSON。解析失败是否指示了它在哪里出错?发现问题:JSON包含一些不需要的字符(如0xEF 0xBB 0xBF)。我比较了两个JSON文件(左侧的一个包含OneDrive API的响应,右侧的一个是手工制作的JSON)第一个给了我
SyntaxError:Unexpected token
,第二个被正确解析。看起来像一个BOM表-可能它没有在内容类型中报告正确的字符集。非常感谢你指出这一点!
lsdir("/vpsSync/", null, null, function(folder, originalpath) {
            console.log(("Directory contents of " + originalpath).bold);
            console.log(folder.data.map(function(arr) {
                if (arr.type == "folder") {
                    return arr.name + "/";
                }
                return arr.name;
            }).join("\n"));
        });