2013-01-18 6 views
82

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

スローされた例外をキャプチャするにはどうすればよいですか?ドコには例外がスローされたことは記載されていないので、私はどのような例外を捕まえる必要があるのか​​分かりません。 try/catch文のジェネリックな「あらゆる可能な例外をキャッチ」が気に入らないことに注意してください。この場合、ファイルが存在しないときに発生する特定の例外をキャッチして、readFileSyncを実行しようとします。

あなたがエラーをキャッチする必要があり、私は同期機能を使用するべきではありませんコメントは

+0

ます。また 'FSを使用することができます。 [私の新しい答え](http://stackoverflow.com/a/32804614/938236) –

答えて

127

基本的には、fs.readFileSyncは、ファイルが見つからないエラーがスローされます。ちょうどそのプロトタイプチェーンを見て、

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 
} 

は、残念ながら、あなたがスローされたエラーを検出することはできません:このエラーはErrorプロトタイプからのものであり、throwを使用して投げ、キャッチするので、唯一の方法は、try/catchブロックである

if (err instanceof Error) 

は、実行するのが最良です。これはほとんどのエラー(すべてではない場合)に当てはまります。

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

この方法では、あなただけのこの特定のエラーに対処し、他のすべてのエラーを再スロー:そこで私は、あなたがcodeプロパティで行くと、その値をチェックすることをお勧めしたいです。このことができます

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

希望:

代わりに、この場合もある詳細なエラーメッセージを、確認するために、エラーのmessageプロパティにアクセスすることができます。

+0

ありがとう、それは私が探していた情報です。私はちょうどそれが特定の種類のエラーであると推測しました。私はちょうど私がtry/catchがどのように動作するか誤解していることに気がつきました。私はあなたが特定のエラータイプ(la java)をキャッチできると考えていました。情報Goloをありがとう。 :-) – Metalskin

+0

あなたは大歓迎です:-)! –

+1

また、 'EACCES'コードは、ファイルが存在するが、アクセス権の不足のために読み取ることができない場合のif文でチェックする必要があります。 –

7

:-)必要とされていないので、私は、唯一の同期機能を実行する接続の試行を提供する前に起動していますので注意してくださいとエラーの種類を確認してください。

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 
} 
+0

で見ることができるようにexistsSync() – drudru

+0

@drudru良いコール、固定。 – loganfsmyth

12

受け入れられた解決策は問題ありませんが、これを処理する方法がはるかに優れています。ファイルが同期的に存在する場合は、単にチェックすることができます。

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'); 
} 
+2

、fs.existsSyncは[もう廃止されません](https://nodejs.org /api/fs.html#fs_fs_existssync_path): "fs.exists()は非推奨ですが、fs.existsSync()はそうではありません。 – falkodev

+3

まあまあです。 existsSyncとreadFileSyncの呼び出しの間にファイルがディスクから削除されたらどうなりますか?あなたのコードには、競合状態が発生するのを待っています... – tkarls

+1

@tkarlsはい、それは2015年にNode.jsをまだ学んでいたときに書かれたものであり、競合状態です。しかし、この競合状態の似たようなことは、それが基本的に無視することができるように、最小限であり、第二に、私はtry/catchを使用してasync/awaitを使用してコードをより柔軟にすることです。 "他の"例外(Nodeは例外的であるため)。 –

3

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

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 {}; 
    } 
})(); 
+0

あなたのソリューションにECMAScript 6用のソリューションが追加されている可能性があります。01/01/18現在、IEからのサポートはありませんが、ブラウザ使用率は約77%です(https://caniuse.com/#feat=矢印関数)。私は好奇心が強いです、あなたはどのようにIEのユーザーに対応していますか? – Metalskin

+0

@ Metalskin Webpack + Babel。しかし、 'fs'はNodeモジュールです – sdgfsdh

+0

ああ、私はノードに触れていません。私が質問したときにノードがES6をサポートしていないと思われます(間違っている可能性があります)。これはノードの質問でもあることを忘れていました;-) – Metalskin