简单的 JavaScript 代码不适用于 nodejs
Simple JavaScript code does not work with nodejs
我是一名经验丰富的 JavaScript 程序员,但我才刚刚开始学习 node.js。
使用node,我想读取一个目录的内容,并且只打印出特定扩展名的文件。目录和文件扩展名都将由命令行参数给出。
但是,我也想在解决这些难题时推动自己探索 JavaScript 编程概念,所以我想创建一个 File
对象来存储有关文件的信息,并使用它解决问题。
正因为如此,我的方法 过于复杂,而且我知道有更简单的方法可以做到这一点,但我只想要一个解决我当前问题的答案:
为什么node.js会抛出如下错误
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
对象)。
对我(没有经验的我)来说,node 可能犯了几个错误:
- 没有正确处理正则表达式(我已经做过测试,这似乎很可能)
- 使用方括号在对象中查找键
'0'
,而不是在数组中查找索引 0
。
或者我可能犯了几个错误:
- 不理解
fs.readdir
及其必要的回调。
- 不理解 JavaScript 和 Node
中构造函数之间可能存在的差异
请帮忙,我想要一个解决或解释我当前问题的答案,而不是解决它的答案。
谢谢。
Why does node.js throw the following error
this.baseName = /.+(?=\.[^.]+)/.exec(file)[0];
^
TypeError: Cannot read property '0' of null
因为file
不匹配正则表达式,所以exec
returnsnull
;那么你正在做 null[0]
,这会抛出异常。例如,a
或 a.
或 .
和 ..
伪目录会发生这种情况。
立即使用 NodeJS 调试器或 console.log
文件,您会看到导致问题的值。
节点有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];
}
}
Node 还有一种 built in 方法来获取扩展名和路径名
var path = require('path');
var basename = path.basename(file);
var extension = path.extname(file);
这是因为任何与您的正则表达式不匹配的文件名,例如许多目录名(包含在您的 list
变量中)将在此处 return 为空:
/.+(?=\.[^.]+)/.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++]));
});
我是一名经验丰富的 JavaScript 程序员,但我才刚刚开始学习 node.js。
使用node,我想读取一个目录的内容,并且只打印出特定扩展名的文件。目录和文件扩展名都将由命令行参数给出。
但是,我也想在解决这些难题时推动自己探索 JavaScript 编程概念,所以我想创建一个 File
对象来存储有关文件的信息,并使用它解决问题。
正因为如此,我的方法 过于复杂,而且我知道有更简单的方法可以做到这一点,但我只想要一个解决我当前问题的答案:
为什么node.js会抛出如下错误
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
对象)。
对我(没有经验的我)来说,node 可能犯了几个错误:
- 没有正确处理正则表达式(我已经做过测试,这似乎很可能)
- 使用方括号在对象中查找键
'0'
,而不是在数组中查找索引0
。
或者我可能犯了几个错误:
- 不理解
fs.readdir
及其必要的回调。 - 不理解 JavaScript 和 Node 中构造函数之间可能存在的差异
请帮忙,我想要一个解决或解释我当前问题的答案,而不是解决它的答案。
谢谢。
Why does node.js throw the following error
this.baseName = /.+(?=\.[^.]+)/.exec(file)[0];
^ TypeError: Cannot read property '0' of null
因为file
不匹配正则表达式,所以exec
returnsnull
;那么你正在做 null[0]
,这会抛出异常。例如,a
或 a.
或 .
和 ..
伪目录会发生这种情况。
立即使用 NodeJS 调试器或 console.log
文件,您会看到导致问题的值。
节点有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];
}
}
Node 还有一种 built in 方法来获取扩展名和路径名
var path = require('path');
var basename = path.basename(file);
var extension = path.extname(file);
这是因为任何与您的正则表达式不匹配的文件名,例如许多目录名(包含在您的 list
变量中)将在此处 return 为空:
/.+(?=\.[^.]+)/.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++]));
});