2015-11-13 34 views
4

我正在讀一本名爲「Node.js正確方式」的書。觀看基本示例的Node.js文件

本書中的示例代碼之一是我們觀察文件「text.txt」進行更改。

Node.js的代碼如下:

const fs = require('fs'); 
var filename = process.argv[2]; 
console.log(filename); 
var count = 0; 
if (!filename) { 
    throw Error("A file to watch must be specified!"); 
} else { 
    console.log(filename); 
} 

fs.watch(filename, function() { 
    count = count + 1; 
    console.log("File 'text.txt' has been changed ("+count+") times!"); 
}); 

console.log("Now watching " + filename + " for changes..."); 

書中說,終端的命令應該是這樣的:

$ node --harmony watcher.js text.txt 

然而,這種失敗,並給出以下錯誤:

fs.js:1237 
    throw errnoException(err, 'watch'); 
    ^
Error: watch ENOENT 
    at exports._errnoException (util.js:837:11) 
    at FSWatcher.start (fs.js:1237:11) 
    at Object.fs.watch (fs.js:1263:11) 
    at Object.<anonymous> (/home/ubuntu/workspace/watcher.js:12:4) 
    at Module._compile (module.js:434:26) 
    at Object.Module._extensions..js (module.js:452:10) 
    at Module.load (module.js:355:32) 
    at Function.Module._load (module.js:310:12) 
    at Function.Module.runMain (module.js:475:10) 
    at startup (node.js:117:18) 

除非我打這樣的完整目標文件路徑:

$ node --harmony watcher.js /home/ubuntu/workspace/text.txt 

哪一個是正確的?爲什麼它會識別「watcher.js」文件而不是text.txt文件,儘管它們都在同一目錄中?我如何克服這一點,只需在命令行中鍵入「text.txt」?

+0

我的猜測是的text.txt - 是watcher.js輸入,watcher.js在運行時,正在運行的程序的位置是不一樣的「本地路徑'(如果它不同,也許從節點安裝目錄中)。什麼是node.js安裝目錄? –

+0

'ENOENT'意思是「沒有進入」。這是與文件路徑 –

+0

有關的一些錯誤沒有要觀看的文件。我認爲那也是你的問題。 ... – 82Tuskers

回答

1

您應該解析系統中的文件。試試這個命令:

node --harmony watcher.js ./text.txt 

你可以修復你的代碼:

const fs = require('fs'); 
const path = require('path'); 
var filename = process.argv[2]; 
if(!path.isAbsolute(filename)){ 
    filename = path.join(__dirname, filename); 
} 
console.log(filename); 
1

這有兩個變量的作用域做。你應該想到的

node --harmony watcher.js 

爲您正在執行的程序的名稱和

text.txt 

因爲你是餵養它的變量。當你運行節點可執行文件時,它已經知道你所在的目錄,所以它可以'看到'watchers.js。但'test.txt'在哪裏使用?它被fs所佔用,在程序的實際主體中沒有任何你所在目錄的知識。所以它試圖找到/test.txt而不是/home/foo/bar/test.txt

你可以使用https://nodejs.org/docs/latest/api/globals.html#globals_dirname這樣

var filepath = __dirname + filename; 
+0

謝謝,但它應該是var filepath = __dirname +「/」+ filename; –

+0

當然,或者如果你看看David Vega的回答,他建議使用'path.join',這可能比手動字符串連接更清晰。 –