Не удалось вызвать метод внутри контроллера метода в маршруте Nodejs Express Typescript - PullRequest
0 голосов
/ 13 мая 2019

Я получил два класса;authenticationRoutes.ts и authenticationController.ts.В authenticRoutes я вызываю «authenticationController.test», метод «authenticationController.test» вызывает метод authenticationController.generateAccessAuthToken.Всякий раз, когда я делаю это, я получаю следующее сообщение об ошибке: Необработанное отклонение. TypeError: Невозможно прочитать свойство 'generateAccessAuthToken' с неопределенным значением

authenticationRoutes.ts
import { authenticationController } from '../controllers/authenticationController';

        //TEST ROUTE
        this.router.get('/users',  authenticationController.test);

authenticationController.ts


public test(req: Request, res: Response) {
        dbSequelize().User.findAll({
            where: {
                id: '0'
            },
            attributes: ['id']
        }).then((user: UserInstance[]) => {
            this.generateAccessAuthToken('0').then((response: any) => {
                console.log(response);
                res.send(response);
            });
        })
    }


generateAccessAuthToken(_id: any) {
        return new Promise(async (resolve, reject) => {
            await jwt.sign({ id: _id }, SECRET_KEY as string, function (err: Error, token: any) {
                if (err) {
                    reject(err);
                } else {
                    resolve(token);
                }
            })
        })
    }

Я хочу сделать то, что я описалбез получения ошибки.

1 Ответ

1 голос
/ 13 мая 2019

Я думаю, что это поможет:

this.router.get('/users', authenticationController.test.bind(AuthenticationController));

Обычно, когда у вас есть класс A с методом b, если вы передаете A.b, например:

const a = new A();
const b = a.b;
b(); // now 'this' is lost, any reference to `this` in b() code would be undefined

Вы передаете только функцию . Теперь он не имеет ничего общего с классом A, это просто функция .

Итак, среди прочего, вы можете использовать bind, чтобы явно установить контекст this для функции:

const a = new A();
const b = a.b.bind(a);
b(); // so now b() is forced to use a as this context

Могу поспорить, что существует множество дубликатов о вашей проблеме, но я не смог найти никого быстро, потому что поиск сложен (this связывание в js МНОГО проблем).

Надеюсь, это поможет.

...