打字稿:使用对象作为属性 - 这样做的正确方法是什么:

时间:2021-03-03 04:09:34

标签: javascript typescript express

我已将一个属性声明为自定义类,并且在实例化主类的对象后尝试访问其方法。但是当我尝试访问我的属性方法时出现以下错误:

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

}

显然,当我调用 this.fcm.getInstanceTokenInfo 方法时出现错误。

检查我的代码,我可以看到我在路由脚本中正确生成了一个实例:

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

const routes = express.Router();

const pushController = new PushController()

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

如上所示,我使用 express 生成路由。我该怎么做才能纠正这个错误?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用构造函数来实例化 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 :(得分:0)

我找到了解决方案。 当我们为路由器传递一个类方法时,我们会丢失“this”实例。 所以你可以用这种方式来解决你的问题:

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