#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))