【问题标题】:TypeScript - Rest API - Manage router / controller / ClassTypeScript - Rest API - 管理路由器/控制器/类
【发布时间】:2020-11-10 17:34:17
【问题描述】:

我正在尝试使用 Express 和 CoreModel 将初始 Node 项目转换为 TypeScript 项目。

在我最初的项目中,架构如下示例:

处理用户

accountRouter

用户(类):根据用户需要包含特定的方法

CoreModel(父类):包含全局方法作为 CRUD

我已经尝试在 TypeScript 上保持这种方式,只做很少的修改

帐户路由器

import { Router } from 'express';
import { accountController } from '../controllers/accountController'
const router = Router()
const controller = new accountController()

router
    .route('/account')
    .get(controller.showUsers)

export default router 

帐户控制器

import { Request, Response } from 'express'
import { User } from '../models/User'
import * as bcrypt from 'bcrypt'
import { UserInformations, UserInformationsEdit } from '../models/interface'

export class accountController {

    private user: User = new User();


    public async showUsers(req: Request, res: Response): Promise<Response>  {
        
        try {
            console.log('this', this);
            const result = await this.user.findAll()

            return res.json(result)
        } catch (error) {
            throw new Error('error: ' + error.message)

        }

    }
}

用户

import { CoreModel } from './CoreModel'

export class User extends CoreModel {};

核心模型

import db from "../config/db"


export abstract class CoreModel {
    name: any;
    
    
    public async findAll(): Promise<any[]> {
                
        try {
            
            const result = await db.query(
                `SELECT * FROM "${this.name.toLowerCase()}"`
            );

            return result.rows;

        } catch (error) {
            throw new Error('error: ' + error.message)
        }
    }
}

这样我可以转译我的代码,但是当我尝试访问 http://localhost:1234/account 我得到了

Cannot read property 'user' of undefined

在我看来,既然我在路由器中获得了一个 accountController 的实例,那么 this 应该是 accountController,不是吗?

在更广泛的层面上,我很确定我在 TS 中构建我的 API 的方式不是那么好,我试图在互联网上找到示例来重现概念,但我没有找到一些根据我的需要案例。

我很乐意从你那里得到一些意见来克服它

保罗

【问题讨论】:

    标签: javascript node.js typescript api


    【解决方案1】:

    问题出在下面一行:

    router
        .route('/account')
        .get(controller.showUsers)
    

    您将controller.showUsers 传递给get 处理程序。通过这样做,this 上下文将不再引用controller。使用以下方法修复它:

    router
            .route('/account')
            .get(controller.showUsers.bind(controller))
    

    附带说明:您可能需要考虑使用 NestJS 框架来构建基于 Typescript 的强大 API。

    【讨论】:

    • 非常感谢您的回复,它现在工作得更好了 :D 我仍然有一个错误,因为我将 .bind() 添加到 get 处理程序,当我的程序进入 accountController 时,this = accountController { user: User {} } 然后进入 CoreModel this = User {} 我遇到的问题是我在 CoreModel 中处理它的方式。我习惯于使用 this.name 获取类名,在我的程序中我得到无法读取未定义的属性“toLowerCase”你可以在上面的 CoreModel 中找到整个代码提前谢谢,Paul
    • edit 我用 this.constructor.name 得到了它。关于 Nest.js 我听说了很多,但我的计划是开发一个我在 TS vanilla 中能做的最多的 API。我可能会重新考虑
    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2014-09-15
    • 2015-05-04
    • 2011-09-25
    • 2015-12-09
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多