Class.method不是使用ES6类的函数

时间:2019-06-13 09:59:03

标签: javascript node.js ecmascript-6

我创建了一个类,我想在我的node.js应用程序的路由中使用该方法。 一个简单的代码段描述了我在实际应用中遇到的一个smilar问题。

myClass.js:

class MyClass {
    static async sayHi(name) {
        setTimeout(() => {
            return `Hello ${name}`
        }, 3000)
    }
}

module.exports = new MyClass()

index.js:

const MyClass = require('./myClass');
console.log(MyClass.sayHi)

我收到此错误:

undefined

尝试:

console.log(MyClass.sayHi('Hello'))

返回:

MyClass.sayHi is not a function

4 个答案:

答案 0 :(得分:2)

您正在导出类的实例-导入时,您有一个实例,而不是实际的类。调用导入的对象MyClass令人困惑-也许可以将其称为myClassInstance,这样可以清楚地说明问题出在哪里。

如果您有实例,并且想在该类上调用静态方法,请引用.constructor属性。

如果要异步返回某些内容,最好使用Promise,然后在.then调用中调用sayHi以消耗Promise:

class MyClass {
  static sayHi(name) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(`Hello ${name}`);
      }, 1000);
    });
  }
}

const myClassInstance = new MyClass();
// module.exports = myClassInstance;

// index.js:

// const myClassInstance = require('./index');
myClassInstance.constructor.sayHi('foo')
  .then(console.log);

因为您已经显式返回了Promise,所以不需要将静态方法设为async

答案 1 :(得分:1)

您正在导出MyClass的实例。静态方法不是在类的实例上调用的,而是在类本身上调用的。

如果您像这样MyClass导出module.exports = MyClass,则第二种方法应该可以使用。

编辑:

@ T.J。人群指出。如果该类在名为MyClass.js的文件中,请从那里导入而不是从索引导入。

答案 2 :(得分:0)

将行从实例更改为类本身,因为静态方法是无需创建类的实例即可调用的方法。

module.exports = MyClass;

然后将require更改为文件名

 const MyClass = require('./myClass.js');

答案 3 :(得分:0)

@Murtaza Hussain是正确的。

由于该方法是静态的。您可以只导出类,而不创建实例。

module.exports = MyClass;