0

TypeError: Cannot read property 'ghNewPrMethod' of undefined

When I try send a webhook POST to my Typescript application, I get the above error.

I have the following controller

import { GhStatusSchema } from '../models/gh-status.model'; import { Request, Response } from 'express'; import * as crypto from 'crypto'; import { Helpers } from '../helpers'; import { GhNewPrMethod } from '../methods/gh-new-pr.method'; import { GitHubConfig } from '../../config/github'; const secret: string = GitHubConfig.secret; export class GhNewPrController { public helpers: Helpers = new Helpers(); public ghNewPrMethod = new GhNewPrMethod(); public post(req: Request, res: Response) { console.log(111); this.ghNewPrMethod.slackMessage(req.body, req.get('x-github-delivery')) } } 

it seems there is an issue with this.ghNewPrMethod.slackMess and this is undefined.

** gh-new-pr.method.ts**

import * as Slack from 'slack-node'; import { GhMessageSchema } from '../models/gh-new-pr.model'; import { SlackConfig } from '../../config/slack'; import { UsersConfig } from '../../config/users'; import { Helpers } from '../helpers'; export class GhNewPrMethod { helpers: Helpers = new Helpers(); public findSavedPR(id) { return new Promise((resolve, reject) => { GhMessageSchema.find({ pull_request: id }, (err, message) => { if (err || message.length === 0) { reject(err); } resolve(message); }); }); } public slackMessage(payload, header) { console.log(payload); } } 

The reason I'm using another file is break down my controller into smaller functions in another file so some can be re-usable and makes the controller look much cleaner.

Could someone help me

edit:

route.ts

import { Request, Response, NextFunction } from "express"; import { GhNewPrController } from '../controllers/gh-new-pr.controller'; export class Routes { public ghNewPrController: GhNewPrController = new GhNewPrController() public routes(app): void { app.route('/github') .post(this.ghNewPrController.post) } } 
3
  • Where is the call for 'post' method? are you calling it with 'bind' function? Commented Dec 5, 2018 at 17:56
  • Possible duplicate of Typescript "this" inside a class method Commented Dec 5, 2018 at 17:58
  • @benshabatnoam the route works fine, ive added the file so you can see. Commented Dec 5, 2018 at 17:58

1 Answer 1

2

You're having a scoping issue. To fix this use bind function as follows:

app.route('/github').post(this.ghNewPrController.post.bind(this.ghNewPrController))

From developer.mozilla: "The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called."

DEMO

Sign up to request clarification or add additional context in comments.

Comments