Node.js 和 sequelize-typescript - 数据访问对象和业务对象

Posted

技术标签:

【中文标题】Node.js 和 sequelize-typescript - 数据访问对象和业务对象【英文标题】:Node.js and sequelize-typescript - data access objects and business objects 【发布时间】:2018-01-08 04:01:26 【问题描述】:

我在我的 Node.js 服务中使用 sequelize-typescript

我有一个映射到类别表的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并将Category重命名为CategoryEntity

处理此类问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

使用Category 实例的toJSON() 获取实例的“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();
);

【讨论】:

以上是关于Node.js 和 sequelize-typescript - 数据访问对象和业务对象的主要内容,如果未能解决你的问题,请参考以下文章

Node.js和node.js相关的常识

Node.js的线程和进程

Node.js的线程和进程

Node.js 中的模块和包之间的区别?

结合node.js和Python

jQuery 和 Node.js 有啥区别? [关闭]