的Node.js和sequelize,打字稿 - 数据访问对象和业务对象

的Node.js和sequelize,打字稿 - 数据访问对象和业务对象

问题描述:

我用我的Node.js服务sequelize-typescript的Node.js和sequelize,打字稿 - 数据访问对象和业务对象

我有Category类映射到类别表

import { Model, Table, Column } from "sequelize-typescript"; 

@Table 
export class Category extends Model<Category>{ 

    @Column 
    name: string 
} 

我也有CategoryControllerCategoryService

export class CategoryController { 

    ... 

    async getAll(request: Request, response: Response) { 
     let categories = await this.categoryService.getCatergories(); 
     response.json(categories) 
    } 
} 

export class CategoryService { 

    async getCatergories(): Promise<Category[]> { 
     let categories = await Category.findAll<Category>() 
     return categories 
    } 

} 

一切是理所应当的。

但返回Category控制器允许它使用使用继承方法从模型类,如:

export class CategoryController { 

    ... 

    async getAll(request: Request, response: Response) { 
     let categories = await this.categoryService.getCatergories(); 

     // Remove associated row in the database 
     categories[0].destroy() 

     response.json(categories) 
    } 
} 

我想创建一个CategoryModel类是这样的:

export class CategoryModel { 
    id : number 
    name : string 
} 

并修改CategoryService中的所有方法返回CategoryModel实例而不是Category并重命名为CategoryCategoryEntity

处理这样的问题的最佳方法是什么?

使用toJSON()Category实例来获取实例的“JSON表示”。

见sequelize文档的更多信息:http://docs.sequelizejs.com/class/lib/model.js~Model.html#instance-method-toJSON

此外,你可以添加一个接口来实现的toJSON()返回值的类型安全,而不是定义另一个类的:

interface ICategory { 
    id: number; 
    name: string; 
} 

@Table 
export class Category extends Model<Category> implements ICategory{ 

    @Column 
    name: string 
} 

使用toJSON()

Category.findOne(result => { 
    const category: ICategory = result.toJSON(); 
});