Я долго и усердно искал решение этой проблемы по всему stackoverflow и в Интернете, но не смог найти ничего похожего на мою проблему, возможно, потому что я новичок в машинописном тексте, поэтому мне все еще не совсем комфортно с ним .
Я пытаюсь получить доступ к this в своем контроллере и передать зависимость через конструктор.
Ниже мой файл pushNotificationRoute.ts, где я ввожу apn.Provider в контроллер.
import { Request, Response, Application } from "express";
import { PushController } from "../controllers/push-controller";
import { Routes } from "./routes-interface";
import * as apn from "apn";
import { options } from "../configurations/options";
export class PushNotificationRoute implements Routes {
public pushController: PushController
public apnProvider: apn.Provider
constructor() {
this.apnProvider = new apn.Provider(options);
this.pushController = new PushController(this.apnProvider);
}
routes(app: Application) {
console.info("routes called -----")
console.info(this.pushController);
app.route('/notification')
.get( this.pushController.getNotifications);
app.route('/notification/send')
.get(this.pushController.sendNotification);
}
}
затем в контроллере я делаю следующее
import {Request, Response } from 'express';
import * as apn from 'apn';
export class PushController {
public apnProvider: apn.Provider
constructor(apnProvier: apn.Provider) {
this.apnProvider = apnProvier
console.info("new apn provider intialised ", this.apnProvider);
}
public getNotifications(req: Request, res: Response) {
res.json({
message: "get notificatoins"
})
}
public sendNotification(req: Request, res: Response) {
console.info("sendNotification controller function ", this.apnProvider); //crashes here when I call this.apnProvider
let deviceToken = "898Y89F95BC283D2D933376E477AD38D9435552434WEQE633ADC4C58BED9B61"
var note = new apn.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
note.badge = 3;
note.sound = "ping.aiff";
note.alert = "What are you doing now?";
note.payload = {'messageFrom': 'John Appleseed'};
note.topic = "com.mangafruit.compendium";
console.info("sendNotification controller function ", this.apnProvider);
this.apnProvider.send(note, deviceToken).then( (result) => {
console.info("First notification Inshallah this will benifit my family & i")
res.json({
message: "notification send successfully :D"
})
});
}
}
Сервер падает, когда я обращаюсь к this в функции PushController().sendNotification()
Спасибо
как я могу его связать? Я попытался создать var self = this в конструкторе из другого ответа, но не смог заставить его работать, поскольку он локален для конструктора.
См. вопрос об обмане, он охватывает все, что вам нужно знать о предмете. var self — это решение ES5, оно не применимо к классам. В конструкторе должен быть this.method = this.method.bind(this).





this.pushController.sendNotificationпередается как обратный вызов. Он должен быть привязан к правильномуthis.