2017-06-23 6 views
0

Node.js関数に問題があります。私はそれが単なる非同期の関数の問題であることはかなり確信していますが、私は確信したいと思います。私は、ユーザーが入力した特定のパスが存在するかどうかをチェックして有効かどうかを確認しています。node.jsでディレクトリチェックがfalseになる

var directoryExists = exports.directoryExists = function(filePath) { 
return new Promise(function(resolve, reject) { 
    if (fs.statSync(filePath).isDirectory()){ 
    resolve("Valid"); 
    } else { 
    reject("Invalid"); 
    } 
}); 
} 

これらは、関数への私の呼び出しです:

files.directoryExists(sourcePath).then((msg) => { 
    console.log(msg); 
}).catch(function(){ 
    console.error("Promise Rejected"); 
}); 

files.directoryExists(destPath).then((msg) => { 
    console.log(msg); 
}).catch(function(){ 
    console.error("Promise Rejected"); 
}); 

私は非同期プログラミングの全体のコンセプトに非常に新しいですので、これはかなりイライラになってきているお約束します。どんな助けもありがとう。

+0

が良さそうですね。ディレクトリが存在するかどうか確認していますか? –

+0

一見すると、間違っているとは思えませんが、 'fs.statSync'の代わりに' fs.stat'を使用しているはずだと付け加えたいと思います。あなたはすでに約束をしているので、非同期の 'fs.stat'を使うことができるように既に非同期であり、それがディレクトリであるかどうかを解決することができます。 –

答えて

2

これを改善するために変更できる点はありますが、それは実際にあなたを追い抜く非同期なものではありません。

statSyncは例外をスローできます(たとえば、パスが何かと一致しない場合)。あなたはそれを処理していないので、それが投げられると、それは拒絶に変換されます。あなたがcatchハンドラに入っている議論を見ると、例外が発生することがわかります。

Promiseを使用しているため、非同期の改善は、statSyncを使用する理由がないことです。 statを使用するだけで、JavaScriptスレッドを不必要に束縛しないようにします。

だから、の線に沿って何か:もちろん

var directoryExists = exports.directoryExists = function(filePath) { 
    return new Promise(function(resolve, reject) { 
     // Make the request asynchronous 
     fs.stat(filePath, function(err, data) { 
      // If there was an error or it wasn't a directory... 
      if (err || !data.isDirectory()) { 
       // ...reject 
       reject(err || new Error("Not a directory"); 
      } else { 
       // All good 
       resolve(data); 
      } 
     }); 
    }); 
}; 

、あなたは事は、ディレクトリや他のいくつかの選択肢のいずれかでない場合、それはfalseで解決することを選択することもでき、これはちょうどあなたをさらに進めさせます。例えば


、依然として拒絶することエラーを有するが、存在するものがディレクトリであるかどうかのためにtrue/falseで解決します。これは、呼び出し側に最大量の情報を提供していますが、彼らは気にすべてがfalse/trueの場合、彼らは少し難しい作業になり:

var directoryExists = exports.directoryExists = function(filePath) { 
    return new Promise(function(resolve, reject) { 
     // Make the request asynchronous 
     fs.stat(filePath, function(err, data) { 
      if (err) { 
       // Reject on error 
       reject(err); 
      } else { 
       // Return result on success 
       resolve(data.isDirectory()); 
      } 
     }); 
    }); 
}; 

か、それは常に解決すること、falseと一致するものがないかが存在する場合ディレクトリではありません:

var directoryExists = exports.directoryExists = function(filePath) { 
    return new Promise(function(resolve) { 
     // Make the request asynchronous 
     fs.stat(filePath, function(err, data) { 
      resolve(!err && data.isDirectory()); 
     }); 
    }); 
}; 

この機能が動作する方法はたくさんありますが、それはあなた次第です。

+0

... *有効な*パスを指定すると、 'statSync'から例外が発生しません。上記は私の目的のために有効なパスと無効なパスの両方で動作しますが、... –

+0

私はそれをあまりにも複雑にしていたと思います。私はstatSyncの仕事をすることができると思うが、あなたのソリューションははるかに簡単です。ありがとう! –

関連する問題