Я создаю класс и хочу использовать этот метод в маршрутах в своем приложении node.js. Простой фрагмент кода описывает аналогичную проблему, с которой я столкнулся в своем реальном приложении.
мой класс.js:
class MyClass {
static async sayHi(name) {
setTimeout(() => {
return `Hello ${name}`
}, 3000)
}
}
module.exports = new MyClass()
index.js:
const MyClass = require('./myClass');
console.info(MyClass.sayHi)
Я получил эту ошибку:
undefined
Пытающийся:
console.info(MyClass.sayHi('Hello'))
возвращает:
MyClass.sayHi is not a function
Не экспортируйте module.exports = new MyClass()
, экспортируйте сам MyClass
!
Вы экспортируете экземпляр MyClass
. Статические методы вызываются не для экземпляров класса, а для самого класса.
Если вы экспортируете MyClass
так: module.exports = MyClass
, ваш второй подход должен работать.
редактировать:
Как @T.J. — заметил Кроудер. Если класс находится в файле с именем MyClass.js, импортируйте оттуда вместо index.
Импорт также некорректен. Должно быть require("./MyClass")
, а не require("./index")
.
@LawrenceCherone Это не сработает, но я думаю, это сам по себе вопрос. Т.Дж. Краудер, я отредактировал исходный ответ.
Вы экспортируете экземпляр класса - при импорте у вас есть экземпляр, а не фактический класс. Вызов импортированного объекта MyClass
сбивает с толку — возможно, вместо этого назовите его myClassInstance
, что прояснит, в чем проблема.
Если у вас есть экземпляр и вы хотите вызвать статический метод класса, укажите ссылку на свойство .constructor
.
Если вы хотите вернуть что-то асинхронно, лучше всего использовать промис, а затем вызвать .then
в вызове sayHi
, чтобы использовать промис:
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.info);
Нет необходимости, чтобы статический метод был async
, так как вы уже явно возвращаете промис.
Измените строку с экземпляра на сам класс, поскольку методы Статический — это методы, которые можно вызывать без создания класса пример.
module.exports = MyClass;
и измените требование на имя файла
const MyClass = require('./myClass.js');
@ Муртаза Хуссейн прав.
Так как метод статический. вы можете просто экспортировать класс вместо создания экземпляра.
module.exports = MyClass;
Где вы тестируете
console.info(MyClass.sayHi('Hello'))
? вы никогда не экспортируете класс, поэтому вы никогда не сможете вызывать этот код извне (FWIW именно так вы должны вызывать функцию, поскольку она статическая).