我是一位经验丰富的JavaScript程序员,但我刚开始学习node.js。
使用节点,我想读取目录的内容,并打印出只有特定扩展名的文件。目录和文件扩展名都将由命令行参数提供。
但是,我也想在解决这些难题时推动自己并探索JavaScript编程概念,因此我想创建一个File
对象来存储有关文件的信息,并使用它来解决问题。 / p>
由于这个原因,我的方法 过于复杂,我知道有更简单的方法可以做到这一点,但我只想找到一个能够解决我当前问题的答案:
this.baseName = /.+(?=\.[^.]+)/.exec(file)[0];
^
TypeError: Cannot read property '0' of null
function File(file){
if (file instanceof File) return file;
if (!(this instanceof File)) return new File(file);
if (typeof file !== "string") throw new Error("Useful error." + typeof(file));
this.fullName = file;
/*vvvvvvvvvvvv Important Bit vvvvvvvvvvvvvv*/
this.baseName = /.+(?=\.[^.]+)/.exec(file)[0];
this.extension = /[^.]+(?=$)/.exec(file)[0];
}
File.prototype = {
isOfType: function(ext){
return ext === this.extension;
}
}
var fs = require('fs');
var argv = process.argv;
fs.readdir(argv[2], function(err, list){
var res = list.filter(function(element, index, array){
var file = new File(element);
return file.isOfType(argv[3]);
});
console.log(res);
});
但是,在Chrome js控制台中,它运行正常(当然使用模拟process
和fs
个对象。)
对我来说(没经验的我)看起来节点可能会犯几个错误:
'0'
,而不是数组中的索引0
。或者我可能犯了几个错误:
fs.readdir
及其必要的回调。请帮助,我想要一个解决或解释我当前问题的答案,而不是解决它的问题。
感谢。
答案 0 :(得分:2)
为什么node.js会抛出以下错误
的属性“0”
this.baseName = /.+(?=\.[^.]+)/.exec(file)[0];
^ TypeError:无法读取null
由于file
与正则表达式不匹配,因此exec
会返回null
;然后你正在做null[0]
,它会抛出异常。例如,a
或a.
等名称或.
和..
伪目录就会发生这种情况。
立即使用NodeJS调试器或console.log
文件`,您将看到导致问题的值。
答案 1 :(得分:2)
节点使用built in方式检查有效文件
function File(file){
if (file instanceof File) return file;
if (!(this instanceof File)) return new File(file);
if (typeof file !== "string") throw new Error("Useful error." + typeof(file));
var stat = fs.statSync(file);
if ( stat && stat.isFile() ) {
this.fullName = file;
/*vvvvvvvvvvvv Important Bit vvvvvvvvvvvvvv*/
this.baseName = /.+(?=\.[^.]+)/.exec(file)[0];
this.extension = /[^.]+(?=$)/.exec(file)[0];
}
}
节点还有一种built in方式来获取扩展名和路径名
var path = require('path');
var basename = path.basename(file);
var extension = path.extname(file);
答案 2 :(得分:0)
这是因为任何与您的正则表达式不匹配的文件名,例如许多目录名(包含在list
变量中),都将在此处返回null:
/.+(?=\.[^.]+)/.exec(file)
所以你正在尝试
null[0]
哪个不起作用。
我通过简单地检查文件名中的句号来解决这个问题:
var file = (element.indexOf(".") > -1) ? new File(element) : false;
return (file) ? file.isOfType(argv[3]) : false;
过滤器中的,因此最终代码类似于:
fs.readdir(argv[2], function(err, list){
var res = list.filter(function(element, index, array){
var file = (element.indexOf(".") > -1) ? new File(element) : false;
return (file) ? file.isOfType(argv[3]) : false;
});
for (var i = 0; i < res.length; console.log(res[i++]));
});