Node.js 简单JavaScript代码不适用于nodejs

Node.js 简单JavaScript代码不适用于nodejs,node.js,javascript,regex,fs,Node.js,Javascript,Regex,Fs,我是一名经验丰富的JavaScript程序员,但我刚刚开始学习 使用node,我希望读取目录的内容,并仅打印特定扩展名的文件。目录和文件扩展名都将由命令行参数提供 但是,我还想在解决这些难题时推动自己,探索JavaScript编程概念,因此我想创建一个文件对象来存储有关文件的信息,并使用它来解决问题 鉴于此,我的方法过于复杂,我知道有更简单的方法可以做到这一点,但我只想要一个解决我当前问题的答案: 为什么node.js抛出以下错误 this.baseName=/.+(?=\..[^.]+)/.e

我是一名经验丰富的JavaScript程序员,但我刚刚开始学习

使用node,我希望读取目录的内容,并仅打印特定扩展名的文件。目录和文件扩展名都将由命令行参数提供

但是,我还想在解决这些难题时推动自己,探索JavaScript编程概念,因此我想创建一个
文件
对象来存储有关文件的信息,并使用它来解决问题

鉴于此,我的方法过于复杂,我知道有更简单的方法可以做到这一点,但我只想要一个解决我当前问题的答案:

为什么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
  • 或者我可能会犯几个错误:

  • 不理解fs.readdir及其必要的回调
  • 不理解JavaScript和Node中构造函数之间可能存在的差异
  • 请帮忙,我想要一个解决或解释我当前问题的答案,而不是一个解决问题的答案

    谢谢

    为什么node.js抛出以下错误

    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_存储文件