繁体   English   中英

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

[英]Simple JavaScript code does not work with nodejs

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

使用节点,我想读取目录的内容,并仅打印特定扩展名的文件。 目录和文件扩展名都将由命令行参数给出。

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

Becaause这一点,我的做法过于复杂,我知道有这样做的简单的方法,但我只是想解决了我目前的问题的答案:

为什么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控制台中,它运行良好(当然具有模拟processfs对象)。

对我(经验不足的我)来说,节点似乎犯了几个错误:

  1. 无法正确处理正则表达式(我已经做过测试,这似乎有可能)
  2. 使用方括号在对象内查找键'0' ,而不在数组内查找索引0

否则我可能会犯几个错误:

  1. 不了解fs.readdir及其必要的回调。
  2. 不了解JavaScript和Node中的构造函数之间的可能差异

请提供帮助,我想要一个解决或解释我当前问题的答案,而不是解决该问题的答案。

谢谢。

为什么node.js会引发以下错误

this.baseName = /.+(?=\\.[^.]+)/.exec(file)[0]; ^ TypeError:无法读取null的属性“ 0”

因为file与正则表达式不匹配,所以exec返回null 那么您正在执行null[0] ,它将引发异常。 对于像aa.这样的名称,就会发生这种情况a. (例如或) . ..伪目录。

立即使用NodeJS调试器或仅使用console.log文件,您将看到引起麻烦的值。

节点具有一种内置方式来检查有效文件

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还具有获取扩展名和路径名的内置方式

var path = require('path');

var basename = path.basename(file);

var extension = path.extname(file);

这是因为任何与您的正则表达式都不匹配的文件名,例如许多目录名(包含在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++]));
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM