错误:仅使用promise.all和ssh2-sftp-client找到一个承诺的文件

时间:2017-02-08 10:51:36

标签: node.js asynchronous promise sftp writefile

我遇到了fs.writeFile()和Promise.all的问题。

我有一个脚本从收件箱中获取文件,将其保存在服务器上并将其发送到多个SFTP,以便他们可以使用它。我遇到的问题是我总是有一个我的承诺,它会抛出一个错误,说该文件不存在。我怀疑有一个不正常的过程有问题,但我无法找出我做错了什么。

我正在使用ssh2-sftp-client和fs包。

请在下面找到我的代码摘录:

$config = $this->getServiceLocator()->get('Config');
$filters = $config['filters'];

在sendFiletoFTP函数下面:

//I just got the dropboxfile with promise 
.then(function(data) {
    myDownloadedFile = data.name
    return new Promise((res,rej) => {
            fs.writeFile(myDownloadedFile, data.fileBinary, 'binary', function (err) {
                if (err) { 
                    throw err
                    rej("file not saved")
                } else {
                    log.info('File save : ' + data.name)
                    res()
                }
            })
        })
    })
    //FTP sending
    .then(function() {
        return Promise.all([sendFiletoFTP(myConnection1, "partner1"), sendFiletoFTP(myConnection2, "partner2"), sendFiletoFTP(myConnection3, "partner3")])
    })

我得到的错误是:错误:找不到在sftp.put()操作期间触发的文件。

你对可能出现的问题有任何想法吗?

1 个答案:

答案 0 :(得分:0)

注意:您的第一个代码段似乎有箭头与常规功能的组合,没有明显的原因!为什么不在任何适当的地方使用箭头功能

myDownloadedFile看起来是全局的(或者必须存在于包含两个代码片段的范围内),所以在发送完成之前有些事情可能会破坏它吗?

现在,通过将filename传递给sendFiletoFTP函数,您可以确保某些全局不会获得"破坏"在异步内容完成之前 - 这是我怀疑正在发生的事情,但没有看到所有相关的代码,这只是一个猜测。在下面的代码中,第一个Promise被解析为data.name, 删除任何var的需要,因为该名称是启动FTP进程的.then的参数

重写第一个片段如下:

.then(data => new Promise((res,rej) => 
    fs.writeFile(myDownloadedFile, data.fileBinary, 'binary', err => {
        if (err) { 
            rej("file not saved");
        } else {
            log.info('File save : ' + data.name);
            res(data.name);
        }
    })
))
//FTP sending
.then(filename => Promise.all([
        sendFiletoFTP(myConnection1, "partner1", filename), 
        sendFiletoFTP(myConnection2, "partner2", filename), 
        sendFiletoFTP(myConnection3, "partner3", filename)
    ])
);

sendFiletoFTP不需要新的Promise构造函数,因为Client()。connect已经返回一个promise。添加额外参数,然后函数变为

var sendFiletoFTP = function (FTPObj, myPartenaire, myDownloadedFile) {
    return new Client().connect(FTPObj)
    .then(() => sftp.put(myDownloadedFile, myDownloadedFile))
    .then(data => sftp.end())
    .then(() => log.info("OK pour " + myPartenaire + " : " + myDownloadedFile));
};