我创建了一个类,我想在我的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
答案 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;