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

时间:2017-08-01 10:22:10

标签: node.js typescript orm sequelize.js

我在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 个答案:

答案 0 :(得分:2)

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

有关详细信息,请参阅sequelize docs: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();
});