1

我有两节课;authenticationRoutes.ts 和 authenticationController.ts。在 authenticationRoutes 我调用“authenticationController.test”,“authenticationController.test”方法调用“authenticationController.generateAccessAuthToken”方法。每当我这样做时,我都会收到以下错误:未处理的拒绝类型错误:无法读取未定义的属性“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);
                }
            })
        })
    }

我希望能够做我描述的事情而不会收到错误。

4

2 回答 2

3

我认为这可以解决问题:

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

我敢打赌,您的问题有很多重复项,但我找不到任何人,因为搜索很棘手(thisjs 中的绑定有很多问题)。

希望这可以帮助。

于 2019-05-13T13:25:28.197 回答
1

我遇到了同样的问题并解决了它:

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);
            });
        })
    }
于 2020-12-15T21:33:05.367 回答