【问题标题】:node and typescript: property undefined when call route节点和打字稿:调用路由时属性未定义
【发布时间】:2020-09-26 19:24:37
【问题描述】:

我决定创建一个没有任何 ORM 的项目,只使用 mysql2 包 + 节点(打字稿),但我很难在下面弄清楚这个问题:

TypeError: Cannot read property 'userService' of undefined

当我尝试调用 get route /api/user 时出现此错误,但服务正在我的控制器类上初始化。我只测试了查询并按预期返回了所有内容。

我的项目的主要结构将有一个用于数据库查询的存储库、一个用于业务逻辑的服务和一个用于管理我的控制器路线。

用户存储库

import pool from './../config/db';

interface IUser {
    id: number,
    login: string,
    created_at: Date,
    updated_at: Date
}

class User {
    async getUsers (): Promise<Array<IUser>> {
        try {
            const [rows]: [Array<IUser>] = await pool.query('SELECT * FROM `clients`', []);
            return rows;
        } catch (err) {
            return err;
        }
    }
}

export default User;

用户服务

import User from './../repository/user';

class UserService {
    private user;

    constructor () {
        this.user = new User();
    }

    getUsers () {
        return this.user.getUsers();
    }
}

export default UserService;

用户控制器

import UserService from '../services/user.service';
import express from 'express';

class UserController {
    public path = '/user';
    public router = express.Router();
    public userService;

    constructor () {
        this.userService = new UserService();
        this.initializeRoutes();
    }

    private initializeRoutes (): void {
        this.router.get(this.path, this.get);
    }

    get (req, res) {
        res.send(this.userService.getUsers());
    }
}

export default UserController;

在我的主文件中,我有这个方法会调用路由:

  private routes (): void {
        const routes = [
            new UserController()
        ];

        routes.forEach((route) => {
            this.app.use('/api', route.router);
        });
    }

【问题讨论】:

    标签: node.js typescript mysql2


    【解决方案1】:

    在 UserController 中,get 类方法函数由路由器调用。所以你应该将get 函数绑定到类实例映射器,所以像这样绑定this

      constructor() {
        this.userService = new UserService();
        this.get = this.get.bind(this); // here you bind the function
        this.initializeRoutes();
      }
    

    【讨论】:

    • 有没有办法避免绑定我的方法?我必须对每个实例化另一个类的方法执行此操作?
    • 我鼓励您重新组织您的代码,尤其是在创建您的路线时。我按照this tutorial 创建图层。您可能会发现它是一个旧教程,但它真的很好。如果你不能将它应用到你的项目中,让我们再谈谈。但是其他选择,你可以使用箭头函数作为类方法,或者找一个合适的 babel 插件,比如this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2020-02-20
    • 1970-01-01
    • 2022-10-13
    • 2020-09-28
    • 2017-07-21
    • 2021-09-29
    相关资源
    最近更新 更多