node.js中的区分大小写的问题

时间:2017-12-15 20:35:17

标签: node.js

我有2个文件, 的 extendableError.js

class ExtendableError extends Error {
  constructor(message) {
    super(message)
    this.name = this.constructor.name
    this.message = message
    if (typeof Error.captureStackTrace === 'function') {
      Error.captureStackTrace(this, this.constructor)
    } else {
      this.stack = new Error(message).stack
    }
  }
}

module.exports = ExtendableError

duplicatedError.js

const ExtendableError = require('./ExtendableError')

class DuplicatedError extends ExtendableError {
  constructor(message) {
    super(message)
  }
}

module.exports = DuplicatedError

以下是我的测试代码,

const DuplicatedError = require('./duplicatedError');
const ExtendableError = require('./ExtendableError');
const ExtendableError1 = require('./extendableError');


try{
    throw new DuplicatedError('hahah');
}catch(err){
    console.log(err instanceof ExtendableError); // true
    console.log(err instanceof ExtendableError1); // false
}

测试是在我的Mac书上,为什么会这样?只有第一个字符大写有不同的结果。我不明白。

2 个答案:

答案 0 :(得分:2)

Mac基于BSD UNIX,因此文件系统区分大小写。

作为附注,通常不使用文件名的文件夹,例如:

  var extendableError = require(‘./extendable-error’)

答案 1 :(得分:0)

首先,出于兼容性原因,macOS选择了不区分大小写的文件系统。但这并不意味着您必须承担它,Disk Utility可用于将分区重新格式化为区分大小写的模式。如果您这样做,node.js会向您报告错误,因为您尝试require的模块名称错误。

然后,让我们谈谈你的测试结果。关键问题是require duplicatedError.js中的哪一个,如果您稍微更改一下:

//change the required name to lowercase extendableError
const ExtendableError = require('./extendableError')

class DuplicatedError extends ExtendableError {
  constructor(message) {
    super(message)
  }
}

module.exports = DuplicatedError

测试结果将是:

false
true

您甚至可以尝试修改duplicatedError.js,如下所示:

//change the required name to extENDableError
const ExtendableError = require('./extENDableError')

class DuplicatedError extends ExtendableError {
  constructor(message) {
    super(message)
  }
}

module.exports = DuplicatedError

结果应为

false
false

所以我认为这不是模块缓存,你有两件事需要明确:

  1. 默认情况下,macOX是不区分大小写的文件系统
  2. 即使您只有一个文件extendableError.js,但是require两次使用不同的名称,例如:require(./extendableError)require(./ExtendableError)require(./extENDableError),trey将是被视为三个模块。