2016-07-28 4 views
0

存在しない場合には何もしません。ただし、ファイルが存在しない場合は何もしません。それは永遠にそこにぶら下がっているだけです。fs.readFileSyncは、ファイルが、私はこのコードを使用してファイルの内容を読み取るしようとしています

1つの解決方法は、ファイルを読み込もうとする前にファイルが存在するかどうかをチェックすることですが、fsモジュールの一部であると期待していました。

これはほとんどすべてのコードですが、問題はありますか?私はできません。

for (var i=0; i<configFiles.length;i++){ 
    waterfallMain(configFiles[i]); 
    } 

//var importDefinition = config.importDefinition; 
function waterfallMain(configFile){ 
    async.waterfall([ 
      function(callback){ 
       sftpHandler.downloadFile(credentials.host, credentials.username, credentials.password, credentials.path+configFile.importFileName, callback); 
       console.log("Downloading done. Changing file encoding and reading data."); 
       readFileSync_encoding(configFile.importFileName, "ISO-8859-1", callback); 
      }, 
      function(fileData, callback) { 
       mainProcess(fileData, callback); 
      }, 
      function(data, callback) { 
       postImportDefinition(data, callback); 
      }, 

      function(data, uri, callback) { 
       postData(data, uri, callback); 
      }, 

      function(syncUri, callback) { 
       getSyncResponseInIntervals(syncUri, callback); 
      }], 

     // the bonus final callback function 
     function(err, status) { 
      if (err) { 
       console.log(err); 
      } 
      console.log(status); 
      return; 
     }); 
} 



function readFileSync_encoding(filename, encoding, callback) { 
     var content = fs.readFileSync(filename); 
     callback(null, iconvlite.decode(content, encoding)); 
     return; 
} 

EDIT:

問題は、私は、私はそれをローカルに実行したとき、私はエラーを受け取った

c9.io使用してきたIDEで実際にしました。 興味深い発見。

+2

存在しないファイルに対してこのコマンドを実行すると、例外がスローされます。 'エラー:ENOENT:そのようなファイルやディレクトリはありません.'not-here.txt''を開きます。例外をキャッチして黙って無視していないと確信していますか? – MrWillihog

+0

それはそれを説明することは事実です。私は滝で呼び出されたそのメソッドを持っていると私はエラーをキャッチする必要があるポイントにコンソールログを置く場合でも、または私はブレークポイントを置く、それは実行されません。私は他の扱いがありません。しかし、より良いチェックを行います。 –

答えて

-1

は、文字列またはnullのいずれかを返す関数を書く

const Fs = require('fs'); 

const readFile = (filename, encoding) => { 

    try { 
     return Fs.readFileSync(filename).toString(encoding); 
    } 
    catch (e) { 
     return null; 
    } 
}; 

const contents = readFile(./somefile', 'utf8'); 
// contents will be null if it doesn't exist or a string of utf8 if it does 
0
あなたが最初にその存在をチェックを試みることができる

var fs = require('fs'); 
var content = ''; 

if(fs.accessSync(filename, fs.R_OK)) { 
content = fs.readFileSync(filename); 
} 

console.log(content); 

UPDATE:非同期メソッドの周りに助けを提供する:

function waterfallMain(configFile){ 
    async.waterfall([ 
      function(callback){ 
       fs.readFile(configFile, callback); 
      }, 
      function(fileData, callback) { 
       //fileData will now contain the contents of the "configFile", if it exists. 
       mainProcess(fileData, callback); 
      } 
    ], function(err, status) { 
     if (err) { 
      console.log(err); 
     } 
     console.log(status); 
    }); 

詳細は3210ドキュメントを参照してください。

+0

ありがとうございます。 'fs.accessAsync(filename、fs.R_OK)' –

+0

どうして '* sync'メソッドを使っているのですか?値が返されるまであなたのコードはブロックされます。すでに 'async'を使用しているので、' fs.readFile'の値を返すことができます。例えば、 'fs.readFile(callback)' – freshnode

+0

わかりません。私はノードに新しいので、私は何か間違っているかもしれない。しかし、私は、私がそれ以上の前にすべての値を得るまで待つ必要があるので、私は 'sync'メソッドとしてそれをやらなければならないと仮定しました。 –

関連する問題