1

私は2つのクラスを取得しました。authenticationRoutes.ts および authenticationController.ts。authenticationRoutes では、「authenticationController.test」を呼び出しています。「authenticationController.test」メソッドは「authenticationController.generateAccessAuthToken」メソッドを呼び出します。これを行うたびに、次のエラーが発生します: Unhandled reject TypeError: Cannot read property 'generateAccessAuthToken' of undefined

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

エラーを受け取ることなく、説明したことを実行できるようにしたいです。

4

2 に答える 2

3

これでうまくいくと思います:

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

基本的にA、 method を持つクラスがある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

あなたの問題にはたくさんの重複があるに違いありませんが、検索が難しいため、すぐに誰かを見つけることができませんでした ( thisjs でのバインドには多くの問題があります)。

お役に立てれば。

于 2019-05-13T13:25:28.197 に答える