web-dev-qa-db-ja.com

fs.readFileSync()のファイルをキャプチャしない方法

Node.js内で readFile() はエラーをキャプチャする方法を示しますが、エラー処理に関する readFileSync() 関数にはコメントがありません。そのため、ファイルがないときにreadFileSync()を使用しようとすると、エラーError: ENOENT, no such file or directoryが表示されます。

スローされている例外をキャプチャするにはどうすればよいですか? docoは、どの例外がスローされるかを述べていないため、どの例外をキャッチする必要があるのか​​わかりません。 try/catchステートメントの一般的な「すべての可能な例外をキャッチ」スタイルは好きではないことに注意してください。この場合、ファイルが存在しないときに発生する特定の例外をキャッチし、readFileSyncを実行しようとします。

接続試行を提供する前に、起動時にのみ同期機能を実行することに注意してください。そのため、同期機能を使用するべきではないというコメントは不要です:-)

111
Metalskin

基本的に、fs.readFileSyncは、ファイルが見つからない場合にエラーをスローします。このエラーはErrorプロトタイプからのものであり、throwを使用してスローされるため、キャッチする唯一の方法はtry / catchブロックを使用することです。

var fileContents;
try {
  fileContents = fs.readFileSync('foo.bar');
} catch (err) {
  // Here you get the error when the file was not found,
  // but you also get any other error
}

残念ながら、プロトタイプチェーンを見ただけでは、どのエラーがスローされたかを検出できません。

if (err instanceof Error)

できる最善の方法であり、これはほとんどの(すべてではないにしても)エラーに当てはまります。したがって、codeプロパティを使用して、その値を確認することをお勧めします。

if (err.code === 'ENOENT') {
  console.log('File not found!');
} else {
  throw err;
}

この方法では、この特定のエラーのみを処理し、他のすべてのエラーを再スローします。

または、エラーのmessageプロパティにアクセスして、詳細なエラーメッセージを確認することもできます。この場合は次のとおりです。

ENOENT, no such file or directory 'foo.bar'

お役に立てれば。

177
Golo Roden

受け入れられている解決策は問題ありませんが、これを処理するはるかに良い方法を見つけました。ファイルが同期して存在するかどうかを確認するだけです。

var file = 'info.json';
var content = '';

// Check that the file exists locally
if(!fs.existsSync(file)) {
  console.log("File not found");
}

// The file *does* exist
else {
  // Read the file and do anything you want
  content = fs.readFileSync(this.local, 'utf-8');
}
18

エラーをキャッチして、エラーの種類を確認する必要があります。

try {
  var data = fs.readFileSync(...)
} catch (err) {
  // If the type is not what you want, then just throw the error again.
  if (err.code !== 'ENOENT') throw err;

  // Handle a file-not-found error
}
9
loganfsmyth

これらのシナリオでは、すぐに呼び出されるラムダを使用します。

const config = (() => {
  try {
    return JSON.parse(fs.readFileSync('config.json'));
  } catch (error) {
    return {};
  }
})();

asyncバージョン:

const config = await (async () => {
  try {
    return JSON.parse(await fs.readFileAsync('config.json'));
  } catch (error) {
    return {};
  }
})();
3
sdgfsdh