我遇到了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()操作期间触发的文件。
你对可能出现的问题有任何想法吗?
答案 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));
};