目录检查在node.js中返回false

时间:2017-06-23 17:13:10

标签: javascript node.js promise

我遇到了Node.js函数的问题。我很确定这只是函数异步的问题,但我想确定。我正在检查用户输入的某个路径是否有效,方法是检查它是否存在。

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");
 });

我对异步编程和承诺的整个概念都很陌生,所以这变得非常令人沮丧。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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解析是否存在某个目录;这为调用者提供了最大量的信息,但如果他们关心的是真/假,则会让他们更加努力:

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

此功能的行为方式很多,取决于你。