Class.method не является функцией, использующей классы ES6

Я создаю класс и хочу использовать этот метод в маршрутах в своем приложении 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

Где вы тестируете console.info(MyClass.sayHi('Hello'))? вы никогда не экспортируете класс, поэтому вы никогда не сможете вызывать этот код извне (FWIW именно так вы должны вызывать функцию, поскольку она статическая).

James 13.06.2019 12:03

Не экспортируйте module.exports = new MyClass(), экспортируйте сам MyClass!

Bergi 13.06.2019 12:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
2 679
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы экспортируете экземпляр MyClass. Статические методы вызываются не для экземпляров класса, а для самого класса.

Если вы экспортируете MyClass так: module.exports = MyClass, ваш второй подход должен работать.

редактировать:

Как @T.J. — заметил Кроудер. Если класс находится в файле с именем MyClass.js, импортируйте оттуда вместо index.

Импорт также некорректен. Должно быть require("./MyClass"), а не require("./index").

T.J. Crowder 13.06.2019 12:03

@LawrenceCherone Это не сработает, но я думаю, это сам по себе вопрос. Т.Дж. Краудер, я отредактировал исходный ответ.

Tim VN 13.06.2019 12:08
Ответ принят как подходящий

Вы экспортируете экземпляр класса - при импорте у вас есть экземпляр, а не фактический класс. Вызов импортированного объекта 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;

Другие вопросы по теме