2017-02-08 11 views
0

fs.writeFile() 및 Promise.all에 문제가 있습니다.오류 : promise.all 및 ssh2-sftp-client와의 약속이 하나만있는 파일을 찾을 수 없습니다.

나는 보관 용 상자에서 파일을 가져 와서 서버에 저장하고 여러 SFTP로 보내어 사용할 수 있도록하는 스크립트가 있습니다. 내가 가진 문제는 파일이 존재하지 않는다는 오류를 던지는 내 약속 중 하나가 항상 있다는 것입니다. 나는 어색한 과정에 문제가 있다고 의심하지만 내가 잘못한 것을 발견 할 수는 없다.

ssh2-sftp-client 및 fs 패키지를 사용하고 있습니다.

내 코드의 추출물을 검색 할 수 있습니다 :

//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")]) 
    }) 

그리고 sendFiletoFTP 기능 아래 : 내가 가진

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

오류 : 오류 : 파일 SFTP를하는 동안 트리거되는 찾을 수 없습니다. put() 액션.

무엇이 잘못 될 수 있는지 알고 계십니까?

+0

오류의 원인은 표시되지 않지만 promise 생성자 콜백에 'throw'하지 마십시오. 귀하의 경우에는 작동하지만 ' rej()'. 'throw '를 생략하고'rej()'를 수행하는 것이 좋습니다. 또한 두 번째 기능은 새로운 약속을 만들 필요가 없습니다. 'res'를 호출하지 않고'catch '를 사용하지 않고'sftp.connect() .then() .then()'체인을 반환하십시오. – trincot

+1

'myDownloadedFile'은 전역으로 보입니다 (또는 두 코드 스 니펫을 둘러싸는 범위 내에 있어야합니다). 그래서 송신이 끝나기 전에 무언가 * 문제가 될 수 있습니까? ... 왜'sendFiletoFTP' 파일 이름을 받아 들일 수없는'var sendFiletoFTP = function (FTPObj, myPartenaire, filename) {'그리고'sendFiletoFTP (myConnection1, "partner1", myDownloadedFile) –

답변

0

참고 : 첫 번째 스 니펫에는 뚜렷한 이유없이 화살표 대 일반 기능이 조합 된 것처럼 보입니다! 왜 그들이 적절한 이다 어디서나 화살표 기능을 사용하지

myDownloadedFile 보이는 세계 (또는 둘 다 코드 조각을 둘러싸는 범위에 있어야합니다), 그래서 뭔가 송신 완료 전에 건드리지 할 수있다? 이제

, 전달하여 filenamesendFiletoFTP 기능, 당신은 비동기 물건 완료되기 전에 일부 글로벌 는 "사방"되지 않습니다 보장 할 수 있습니다 - 나는 무슨 일이 일어나고 의심 무엇이다,하지만 모든 관련을 보지 않고 코드, 그건 그냥 추측입니다. 이름이 다음과 같이 첫 번째 조각을 다시 쓰기는 FTP 과정을

를 시작 .then에 인수가 있기 때문에 아래의 코드에서 첫 번째 약속은 어떤 VAR에 대한 필요성을 제거 data.name, 에 해결 :

.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)); 
};