前提・実現したいこと
node.jsで画像を収集するプログラムを作成しています。
URLに対してリクエストを投げ、返ってきたものをfs.writeFileSyncで保存しています。
現在、requestを非同期に行い、保存ファイルが1000件になったら圧縮して元のファイルを削除という処理を行っているのですが、ファイルの削除をする段階で書き込んでいるものがcloseしていないのか、エラーが発生してプログラムが止まってしまいます。
nodejs
1for(let imageURL of imageURLs) { 2 const options = { 3 method: 'get', 4 url: imageURL, 5 encoding: null, 6 }; 7 request( 8 options, 9 async (error,response,body) => { 10 if(!error && response.statusCode === 200) { 11 fs.writeFileSync(imagePath,body,'binary'); 12 console.log(`${count}: ${imageURL}`); 13 console.log(imagePath); 14 } 15 else { 16 console.log(`ERROR: 「${imageURL}」`); 17 console.error(error || response.statusCode); 18 } 19 } 20 ); 21 22 if(download_count == 1000) { 23 await compress(file_name) // 圧縮処理を行う関数 24 fsEx.emptyDirSync("images") 25 } 26}
これの解決案として、以下の2つを考えています。
- requestを非同期にし、ファイルの書き込みが終了するまで次のリクエストを投げない
- ファイルの削除を行う直前で適当な秒数sleepする処理を入れ、ファイルの書き込みが終了するのを待つ
1の方法だと画像の取得時間が大幅に伸びてしまうという問題があります。
2の方法は具体的に何秒待てばいいのかわからないため、ある程度長めに猶予をとっても同じエラーが起きてしまう可能性があります。
node.jsのリファレンスを読んだところ、ファイル書き込み時に、完全に書き込みが終了するとfinishのイベントが発生するということが書いてありました。
なので、そのイベントが発生するまで待機することで実現したい処理ができるのではないかと考えました。
プログラム内でイベントの待ち方がわからないためどなたか詳しい方がいらっしゃいましたら、ご教授いただけると幸いです。
どうかよろしくお願いいたします。
あなたの回答
tips
プレビュー