2017-07-25 73 views
-1

這裏是我的代碼:的NodeJS - 統計並不總是運行

console.log("Path 1: " + fullName); 
fs.stat(fullName, function(err, stats) { 
console.log("Path 2: " + fullName); 
}, function(err) { // I don't know if this part actually does something 
    console.log("An error occurred: " + err); // but I saw it in a different SO answer 
}); 

的代碼根本不會爲某些文件運行。如在,我的日誌將顯示路徑1與文件,但沒有路徑2與文件,也沒有「發生錯誤」。我在想,也許這些文件有一個無效的字符,因爲它們都有相同的標誌。他們看起來像這樣:

​​

即使是這樣,爲什麼沒有錯誤或什麼?如果是這樣,我怎麼才能真正統計這些文件?

回答

2

您還沒有登錄或檢查錯誤。 fs.stat()只接受兩個參數,即文件名和回調函數。您傳遞三個參數,即文件名和兩個單獨的回調。所以第二個回調就是錯誤的。然後,在第一次回調中,您需要檢查err變量以查看是否發生錯誤。

這是正確的用法:

fs.stat(fullName, function(err, stats) { 
    if (err) { 
     console.log("Error in fs.stat(): ", err); 
    } else { 
     console.log("Got stats: ", stats); 
    } 
}); 

如果你想利用這個適當的形式,你還是不要在控制檯中看到任何消息,那麼我建議把一個異常處理它周圍看看別的東西是怎麼回事:

try { 
    console.log("about to call fs.stat()"); 
    fs.stat(fullName, function(err, stats) { 
     if (err) { 
      console.log("Error in fs.stat(): ", err); 
     } else { 
      console.log("Got stats: ", stats); 
     } 
    }); 
} catch(e) { 
    console.log("fs.stat() exception: ", e); 
} 

在看source code for fs.stat(),有幾個方面,它可以拋出一個同步異常,特別是當它檢測到傳遞給它的參數無效。像往常一樣,node.js文檔不描述這種行爲,但你可以在代碼中看到它。這是fs.stat()代碼:

fs.stat = function(path, callback) { 
    callback = makeStatsCallback(callback); 
    if (handleError((path = getPathFromURL(path)), callback)) 
    return; 
    if (!nullCheck(path, callback)) return; 
    var req = new FSReqWrap(); 
    req.oncomplete = callback; 
    binding.stat(pathModule._makeLong(path), req); 
}; 

兩個makeStatsCallback()handleError()可以拋出一個異常(當您在同一個文件看看他們的實現)。


我不知道你在哪裏得到了傳遞兩個回調到fs.stat()的概念。如文檔here所述,它不接受兩個回調函數。它看起來像一個fs庫的promisified版本,其中每個異步操作都會返回一個承諾,然後您可以將兩個回調傳遞給fs.statPromise.then(fn1, fn2),但我不知道這是否是您看到的。

+0

添加了更多關於'fs.stat()'如何拋出異常的信息。 – jfriend00