【问题标题】:How can I export a class in node?如何在节点中导出类?
【发布时间】:2016-11-10 06:53:13
【问题描述】:

这看起来很简单,但我是一个 node/javascript 新手。如何使用节点 7.0.0 从另一个文件导入类?

我在一个文件中定义了我的类:

'use strict';

class MyClass {
  ...
};

module.exports = MyClass;

我想在另一个类中使用它:

var MyClass = require('./path/to/otherfile');
...
var myclass = new MyClass(some param);

但我的 linter 提示错误

TypeError: Class constructor MyClass cannot be invoked without 'new'

【问题讨论】:

  • Node 会抛出错误吗?如果只是棉绒,那有关系吗?
  • 您可能在代码中的其他位置调用了 MyClass() 而没有 new 关键字。
  • 如果你这样做 module.exports.MyClass 是否仍然显示该错误
  • 你为什么不用export default MyClass
  • @Cruiser 使用module.exports.MyClass = MyClass; 会破坏代码而不是修复它。如果您按照您的建议进行操作,那么您要么必须在require 行中使用var MyClass = require('./path/to/otherfile').MyClass;,要么在构造函数调用中使用var myclass = new MyClass.MyClass();,这不是调用代码的样子。请参阅下面的my answer

标签: javascript node.js


【解决方案1】:

此代码是正确的,适用于 Node 7.0.0。看这个例子:

文件class.js

'use strict';
class MyClass {
}
module.exports = MyClass;

文件code.js

var MyClass = require('./class.js');
var myclass = new MyClass();
console.log('OK');

运行:

node code.js

你会看到:

OK

损坏的不是你的代码,而是你的 linter,但你没有指定你使用的是什么 linter,所以很难再说什么。

我不知道为什么人们建议你应该使用 module.exports.MyClass = MyClass; 而不是 module.exports = MyClass; - 它不仅不能解决问题,而且实际上会破坏代码给你一个错误:

TypeError: MyClass is not a constructor 

也有人建议应该使用它:

export default MyClass;

不,它会在 Node 7.0.0 中报错:

SyntaxError: Unexpected token export

阅读 cmets 后,我想知道有多少人实际运行过代码,因为事实证明代码运行良好,但 cmets 中的所有“解决方案”都会破坏它。

我使用原始代码创建了一个 GitHub 项目,并在 Travis 上使用 Node 版本 4、5、6 和 7 测试了建议的解决方案。您可以在此处查看:

测试结果见:

当我知道是哪个 linter 导致了问题时,我会将它添加到项目中,然后我们会看看可以做些什么。

【讨论】:

  • 如 cmets 中所述,该问题与 linter 无关,而仅与 cucumber.js 相关。我不得不将外部类移动到黄瓜 features/ 之外的另一个目录中来解决这个问题。此响应确实回答了如何在 node.js 中导出类的问题
猜你喜欢
  • 2021-10-10
  • 2021-09-15
  • 2020-06-21
  • 1970-01-01
  • 2017-05-04
  • 2018-03-11
  • 1970-01-01
  • 2018-05-22
  • 2019-12-22
相关资源
最近更新 更多