Dropbox JS mass writeFile没有写入所有文件

时间:2015-04-11 02:52:37

标签: javascript node.js dropbox dropbox-api

我有这个代码应该通过某个目录的每个子目录中的文件运行,在我的Dropbox中创建相同的目录(具有相同的路径),并将文件上传到我的Dropbox中的该目录。我正在使用node-walk插件。

//This runs for every file
walker.on('file', function(path, stats, next){
    //Path to where it should upload to on my Dropbox
    var uploadPath = (dbPath + datePath + (path + '/uOcME0OGzMf7G3h39INs' + stats.name).replace('tmp-62u3dPAStPa6upQUa4G4/', '')).split('uOcME0OGzMf7G3h39INs');

    //Path to the file that it's scanning
    var localPath = path + '/' + stats.name;

                //The path without file
    client.mkdir(uploadPath[0], function(error){
        if (error) { return error; }

        fs.readFile(localPath, function(error, data){
            if (error){
                logToFile('fs.readFile error: ' + error);
                console.error(error);
            }

            client.writeFile(uploadPath.join(''), data, function(error, stat){
                if (error) {
                    logToFile('writeFile error: ' + error);
                    console.error(error);
                }
            });
        });
    });

    next();
});

问题是,为了上传文件,我必须多次运行脚本(30次以上)才能上传大部分文件。但即使这样,也有一些文件无法上传。

这是我得到的错误。有时当我运行脚本时没有错误,但下次有错误。即使没有错误,所有文件也不会存在。如果可能的话,我想阻止这种情况发生。

Dropbox API error 503 from POST https://api-content.dropbox.com/1/files_put/auto/dropbox/path/for/file/here.css :: {"error": "Failed to grab locks for 871742009, please re-issue request."}

我可以采取哪些不同方式,以便一次性上传所有文件?

1 个答案:

答案 0 :(得分:2)

错误正在发生,因为您正在开始大量的并行上传。有些是成功的,因为它们在服务器上排队并被阻止,但是如果你发送了多个并发请求,很可能有些人会在轮候等待时超时。

您需要按顺序上传,一次一个(或至少一次一个),以避免此类错误。

编辑:您想要的代码可能是这样的。 (我还没有对它进行过测试。)我取消了对mkdir的调用,因为目录是在Dropbox中隐式创建的,但重要的变化是调用next()的位置。 (我假设有关walker如何运作的事情,但我不知道它是如何运作的。如果这仍然不起作用,你可能想要在调用时记录一些内容{{ 1}}看看它何时被调用。)

writeFile