質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

0回答

397閲覧

fsモジュールで、ファイルの書き込みが完全に完了するまで待機したい

robert

総合スコア20

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

1クリップ

投稿2019/03/22 08:16

前提・実現したいこと

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つを考えています。

  1. requestを非同期にし、ファイルの書き込みが終了するまで次のリクエストを投げない
  2. ファイルの削除を行う直前で適当な秒数sleepする処理を入れ、ファイルの書き込みが終了するのを待つ

1の方法だと画像の取得時間が大幅に伸びてしまうという問題があります。
2の方法は具体的に何秒待てばいいのかわからないため、ある程度長めに猶予をとっても同じエラーが起きてしまう可能性があります。

node.jsのリファレンスを読んだところ、ファイル書き込み時に、完全に書き込みが終了するとfinishのイベントが発生するということが書いてありました。

なので、そのイベントが発生するまで待機することで実現したい処理ができるのではないかと考えました。

プログラム内でイベントの待ち方がわからないためどなたか詳しい方がいらっしゃいましたら、ご教授いただけると幸いです。

どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問