我正在阅读Smashing Node.JS一书,在执行文件浏览器示例时我不断收到参考错误。为什么会发生这种情况,如何解决问题。我已经按照书中的例子进行了操作,所以我对发生的事情感到有点迷失
/**
* Module dependencies.
*/
var fs = require('fs')
, stdin = process.stdin
, stdout = process.stdout;
fs.readdir(process.cwd(), function (err, files) {
console.log('');
if (!files.length) {
return console.log(' \033[31m No files to show!\033[39m\n');
}
console.log(' Select which file or directory you want to see\n');
function file(i) {
var filename = files[i];
fs.stat(__dirname + '/' + filename, function (err, stat) {
if (stat.isDirectory()) {
console.log(' '+i+' \033[36m' + filename + '/\033[39m');
} else {
console.log(' '+i+' \033[90m' + filename + '\033[39m')
}
if (++i == files.length) {
read();
} else{
file(i);
}
});
}
file(0);
});
function read() {
console.log('');
stdout.write(' \033[33mEnter your choice: \033[39m');
stdin.resume();
stdout.setEncoding('utf8');
stdin.on('data', option);
function option( data ) {
if (typeof files[Number(data)] !== "undefined" ) {
stdout.write(' \033[31mEnter your choice: \033[39m');
} else {
stdin.pause();
}
}
}
答案 0 :(得分:1)
在调用read()
时,它无法访问files
,因此在使用typeof files[...]
时会出现引用错误。
一个想法可能是将});
移到file(0)
之后到文件的底部,从而在fs.readdir(process.cwd(), function (err, files) {
块中读取定义files
的内容。
但是,我真的希望这个例子会在你的书中得到扩展:现在,它不将输出你选择的目录的目录内容,但会提示你一遍又一遍地输入一个数字。
答案 1 :(得分:0)
将文件交替传递给读取功能。
请注意,示例代码实际上非常糟糕,我希望作者试图用这个来说明一点,而不是把它当作好代码。
因此,继续使用不良代码的方法是一个完整的工作示例:
var fs = require('fs')
, stdin = process.stdin
, stdout = process.stdout;
fs.readdir(process.cwd(), function (err, files) {
console.log('');
if (!files.length) {
return console.log(' \033[31m No files to show!\033[39m\n');
}
console.log(' Select which file or directory you want to see\n');
function file(i) {
var filename = files[i];
fs.stat(__dirname + '/' + filename, function (err, stat) {
if (stat.isDirectory()) {
console.log(' '+i+' \033[36m' + filename + '\033[39m');
} else {
console.log(' '+i+' \033[90m' + filename + '\033[39m')
}
if (++i == files.length) {
read(files);
} else{
file(i);
}
});
}
file(0);
});
function read(files) {
console.log('');
stdout.write(' \033[33mEnter your choice: \033[39m');
stdin.resume();
stdout.setEncoding('utf8');
stdin.on('data', option);
function option( data ) {
var filename = files[Number(data)];
if (typeof filename !== "undefined" ) {
stdout.write('\n\033[90m' + filename + ':\n\n');
var fileContents = fs.readFileSync(filename)
stdout.write(fileContents);
stdout.write('\033[39m\n\n');
stdout.write(' \033[31mEnter your choice: \033[39m');
} else {
stdin.pause();
}
}
}