Node.js 简单JavaScript代码不适用于nodejs
我是一名经验丰富的JavaScript程序员,但我刚刚开始学习 使用node,我希望读取目录的内容,并仅打印特定扩展名的文件。目录和文件扩展名都将由命令行参数提供 但是,我还想在解决这些难题时推动自己,探索JavaScript编程概念,因此我想创建一个Node.js 简单JavaScript代码不适用于nodejs,node.js,javascript,regex,fs,Node.js,Javascript,Regex,Fs,我是一名经验丰富的JavaScript程序员,但我刚刚开始学习 使用node,我希望读取目录的内容,并仅打印特定扩展名的文件。目录和文件扩展名都将由命令行参数提供 但是,我还想在解决这些难题时推动自己,探索JavaScript编程概念,因此我想创建一个文件对象来存储有关文件的信息,并使用它来解决问题 鉴于此,我的方法过于复杂,我知道有更简单的方法可以做到这一点,但我只想要一个解决我当前问题的答案: 为什么node.js抛出以下错误 this.baseName=/.+(?=\..[^.]+)/.e
文件
对象来存储有关文件的信息,并使用它来解决问题
鉴于此,我的方法过于复杂,我知道有更简单的方法可以做到这一点,但我只想要一个解决我当前问题的答案:
为什么node.js抛出以下错误
this.baseName=/.+(?=\..[^.]+)/.exec(文件)[0];
^
TypeError:无法读取null的属性“0”
在此代码中:
函数文件(文件){
if(file instanceof file)返回文件;
如果(!(此文件实例))返回新文件(文件);
如果(typeof文件!=“string”)抛出新错误(“有用错误”。+typeof(文件));
this.fullName=文件;
/*VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV重要位*/
this.baseName=/.+(?=\..^.]+)/.exec(文件)[0];
this.extension=/[^.]+(?=$)/.exec(文件)[0];
}
File.prototype={
类型:函数(ext){
返回ext==this.extension;
}
}
var fs=需要('fs');
var argv=process.argv;
fs.readdir(argv[2],函数(err,list){
var res=list.filter(函数(元素、索引、数组){
var file=新文件(元素);
返回文件.isOfType(argv[3]);
});
控制台日志(res);
});
但是,在ChromeJS控制台中,它运行良好(当然是模拟process
和fs
对象)
在我看来(我没有经验),node可能犯了几个错误:
'0'
,而不是数组中的索引0
this.baseName=/.+(?=\..[^.]+)/.exec(文件)[0]代码>
^
TypeError:无法读取null的属性“0”
因为file
与正则表达式不匹配,所以exec
返回null
;然后执行null[0]
,这会引发异常。例如,像a
或a.
这样的名称,或
和伪目录,都会出现这种情况
使用NodeJS调试器或仅在前面使用console.log
file`文件,您将看到导致问题的值
为什么node.js抛出以下错误
this.baseName=/.+(?=\..[^.]+)/.exec(文件)[0]代码>
^
TypeError:无法读取null的属性“0”
因为file
与正则表达式不匹配,所以exec
返回null
;然后执行null[0]
,这会引发异常。例如,像a
或a.
这样的名称,或
和伪目录,都会出现这种情况
使用NodeJS调试器或仅在前面使用console.log
file`即可,您将看到导致问题的值。节点有一种检查有效文件的方法
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];
}
}
节点还可以获取扩展名和路径名
var path = require('path');
var basename = path.basename(file);
var extension = path.extname(file);
节点具有检查有效文件的方法
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];
}
}
节点还可以获取扩展名和路径名
var path = require('path');
var basename = path.basename(file);
var extension = path.extname(file);
这是因为任何与正则表达式不匹配的文件名,例如许多目录名(包括在列表中的变量),都将在此处返回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++]));
});
fs.readdir(argv[2],函数(err,list){
var res=list.filter(函数(元素、索引、数组){
var file=(element.indexOf(“.”>-1)?新文件(element):false;
return(file)?file.isOfType(argv[3]):false;
});
for(var i=0;i
这是因为任何与正则表达式不匹配的文件名,例如许多目录名(包含在列表
变量中),都将在此处返回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++]));
});
fs.readdir(argv[2],函数(err,list){
var res=list.filter(函数(元素、索引、数组){
var file=(element.indexOf(“.”>-1)?新文件(element):false;
return(file)?file.isOfType(argv[3]):false;
});
for(var i=0;i
找出问题所在:在出现问题的行之前,尝试使用console.log(文件,/.+(?=\.-.^.]+)/.exec(文件))
并查看其内容(为了理解您的代码,最好将其从文件
重命名为文件名
)。另外,如果(!(this instanceof File))
,您对的使用相当困惑,这不是您应该做的测试。@Mike'Pomax'Kamermans我试过您的测试,我想我现在明白了:fs.readdir
还将目录名放在返回的列表中(可能?),没有点或扩展名,因此找不到匹配项。可能是这种情况吗?directo中是否有.DS_存储文件