Express JS:在路由上调用我的 class 中的方法

Express JS: call a method in my class on routing

我正在使用 Typescript 创建 MERN 应用程序。

我的 class.

上的 this 有一些问题

使用此代码段:

router.post("/create", user.createNewUser);

不可能在函数[=中调用classuser的另一个方法36=]createNewUser.

如果我使用这个片段:

router.post("/create", (req: Request, res: Response, next: NextFunction) => {
    try {
        user.createNewUser(req, res, next);
    } catch (error) {
        res.json(error);
    }
});

它工作正常。

这是我的功能:

createNewUser(req: Request, res: Response, next: NextFunction) {
    try {
        const { password, username, email, id } = req.body;
        const payload: object = { /* HERE MY JSON */ };
        schema.create(payload, async(err: any, result: any) => {
            const isSended = await this.sendRegistrationEmail(email);
            if (err) throw err;
            if (isSended) {
                res.status(200).json(result);
            } else {
                res.status(500).json('error');
            }
        });

    } catch (error) {
        res.status(500).send(error);
    }
};

错误是:

TypeError: Cannot read property 'sendRegistrationEmail' of undefined

我想知道为什么第一个解决方案不起作用,而第二个解决方案有效。

this 关键字很棘手。基本上问题是当你做

router.post("/create", user.createNewUser);

您只传递了 createNewUser 函数的值,而不是整个用户。由于该函数现在只是一个浮动值,没有附加到 user 对象,因此 this 的值变为未定义。

解决方案是

router.post("/create", (...args) => user.createNewUser(...args));

router.post("/create", user.createNewUser.bind(user));