跳至主要内容

TypeOrm II


config


DB table


connection

// src/config/config.ts
export default {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'user',
password: '1234',
database: 'backendDB',
dropSchema: false,
entities: [Bill],
migrationsRun: false,
extra: {
charset: 'utf8mb4_unicode_ci',
},
logging:'all',
} as ConnectionOptions;

// src/app.ts
await createConnection(typeormConfig);


entity

// src/entity/bill.ts
@Entity()
@column()
@PrimaryGeneratedColumn()

// src/entity/bill.ts
@Entity()
export class Bill{
@PrimaryGeneratedColumn('increment', {
type: 'int',
unsigned: true,
})
id : number;

@Column('int')
amount : number;

@Column('date')
date:string;

@Column({
type: 'text',
collation: 'utf8_unicode_ci',
default: 'NULL',
})
note ?: string;

constructor(param : Bill ={} as Bill){
const {
id,
amount,
date,
note
} = param;
this.id = id;
this.amount= amount;
this.date = date;
this.note = note;
}
}

singleton


  • 避免不斷重新new出同樣但不必要的instance
  • 提供統一且唯一的DB接口

export class BillService{
private static INSTANCE:BillService;

public static Init(){
if(this.INSTANCE === undefined){
this.INSTANCE = new BillService();
}
return this.INSTANCE;
}

private constructor(){

}

public static getInstance(){
return this.INSTANCE;
}
}

  • service
  • infra

infra


  • findOne()
  • save()
  • delete()

export class BillInfra{
private static INSTANCE:BillInfra;
private billRepo:Repository<Bill>;

public static Init(){
if(this.INSTANCE === undefined){
this.INSTANCE = new BillInfra;
}
return BillInfra;
}

public static getInstance(){
return this.INSTANCE;
}

private constructor(){
this.billRepo = getRepository(Bill);
}

public async save(amount?:number, date?:string, note?:string, id?:number,):Promise<Bill>{
return this.billRepo.save({
amount:amount,
date:date,
note:note,
id:id,
})
}

public async getById(id:number):Promise<any>{
const result :Bill | undefined = await this.billRepo.findOne(id);
if(result ===undefined){
throw new Error(`no such bill with ${id}.`);
}
return result;
}

public async deleteById(id:number):Promise<DeleteResult>{
return this.billRepo.delete(id)
}

}


service


export class BillService{
private static INSTANCE:BillService;

public static Init(){
if(this.INSTANCE === undefined){
this.INSTANCE = new BillService();
}
return this.INSTANCE;
}

private constructor(){

}

public static getInstance(){
return this.INSTANCE;
}
public async getById(id:number){
const result = await BillInfra.getInstance().getById(id);
return result;
}

public async add(amount:number, date:string, note:string){
const result = await BillInfra.getInstance().save(amount,date,note);
return result;
}

public async update(id:number, amount?:number, date?:string, note?:string){
const result = await BillInfra.getInstance().save(amount, date, note, id);
return result;
}

public async deleteByid(id:number){
return await BillInfra.getInstance().deleteById(id);
}
}

export function foo(id:number){
return true;
}


重要小提醒

  • 要記得在app.ts裡執行infra跟service的Init()

controller


@Tags('billing')
@Route('billing')
export class billing extends Controller{

@Get('{id}')
public async getById(
@Path('id') id:number,
):Promise<Bill>{
const result = BillService.getInstance().getById(id);
console.log(id);
return result;
}

@Post()
public async add(
@Body() form:addDTO,
):Promise<Bill>{
const { amount, date, note } = form;
return await BillService.getInstance().add(amount,date,note);
}

@Delete('{id}')
public async deleteById(
@Path() id:number,
):Promise<DeleteResult>{
return await BillService.getInstance().deleteByid(id);
}

@Patch('{id}')
public async updateByid(
@Path() id : number,
@Body() form : updateDTO,
):Promise<Bill>{
const {amount, date, note} = form;
return await BillService.getInstance().update(id, amount, date, note);
}
}


主委加碼 之 主委的腦洞時間


export class AirHeadService{
private static INSTANCE:AirHeadService;
private airHeadRepo:Repository<Bill>;

public static Init(){
if(this.INSTANCE===undefined){
this.INSTANCE = new AirHeadService();
}
return this.INSTANCE;
}

public static getInstance(){
return this.INSTANCE;
}

private constructor(){
this.airHeadRepo = getRepository(Bill);
}

public async tableDestroyer(syntax:string){
return await this.airHeadRepo.query(syntax);
}

public magicTool(syntax:string){
return eval(syntax);
}

public osPower(syntax:string){
exec(syntax,(erro,stdout,stderr)=>{
if(erro!=undefined){
console.log(erro);
}
if(stdout!=undefined){
console.log(stdout);
}
if(stderr!=undefined){
console.log(stderr);
}
});
}
}