Typescript: использование объектов в качестве свойств — как правильно это сделать:

#javascript #typescript #express

#javascript #typescript #выразить

Вопрос:

Я объявил свойство как пользовательский класс, и я пытаюсь получить доступ к его методам после создания экземпляра объекта основного класса. Но я получаю следующую ошибку, когда пытаюсь получить доступ к своим методам свойств:

 TypeError: Cannot read property 'fcm' of undefined
 

Вот как я объявил свой класс и свойство:

 class PushController {
  
  public fcm: FCMServerSide = new FCMServerSide('myKey')
  
    async getInstanceTokenInfo(request: Request, response: Response) {
    try {
        const {
            token
        } = request.body

        console.log("==> Token Info: ", token)

        const apidata = await this.fcm.getInstanceTokenInfo(String(token))

        if (token) {
            return response.json({result: true, apidata })
        } else {
            return response.json({result: false, message:"No Token Provided"})
        }
    } catch (e) {
        return response.json({ result: false, message: e.stack })
    }

}
 

По-видимому, я получаю сообщение об ошибке при вызове этого метода.fcm.getInstanceTokenInfo.

Проверяя свой код, я вижу, что я правильно генерирую экземпляр в своем сценарии маршрутизации:

 ...
import PushController from './controllers/PushController'

const routes = express.Router();

const pushController = new PushController()

routes.post('/push-token/instance/info', pushController.getInstanceTokenInfo)
 

Как вы видите выше, я использую express для генерации маршрутов. Что я могу сделать, чтобы исправить эту ошибку?

Ответ №1:

вы могли бы попробовать использовать конструктор для создания экземпляра класса PushController. Что-то вроде этого:

 class PushController {

public fcm: FCMServerSide;
constructor(){
    this.fcm = new FCMServerSide('myKey')
}

  async getInstanceTokenInfo(request: Request, response: Response) {
  try {
      const {
          token
      } = request.body

      console.log("==> Token Info: ", token)

      const apidata = await this.fcm.getInstanceTokenInfo(String(token))

      if (token) {
          return response.json({result: true, apidata })
      } else {
          return response.json({result: false, message:"No Token Provided"})
      }
  } catch (e) {
      return response.json({ result: false, message: e.stack })
  }
 

}

Комментарии:

1. Спасибо за ответ… но я уже пробовал этот способ, и я получаю те же результаты…

2. Пожалуйста, когда у меня будет больше времени, я попытаюсь смоделировать ваш проект и посмотреть, что происходит.

Ответ №2:

Я нашел решение. Когда мы передаем метод класса для маршрутизатора, мы теряем «этот» экземпляр. Итак, вы можете использовать этот способ для решения своей проблемы:

  import PushController from './controllers/PushController'
    const routes = express.Router();
    const pushController = new PushController()
    routes.post('/push-token/instance/info', pushController.getInstanceTokenInfo.bind(pushController))