Skip to content

03 TypeORM

JP Barbosa edited this page Apr 17, 2021 · 3 revisions

TypeORM

Add TypeORM, Postgres and reflect-metadata

yarn add typeorm pg reflect-metadata

Obs.: if you prefer you may use MySQL as well.

Configure database connection

code ./.env
...
TYPEORM_CONNECTION=postgres
TYPEORM_HOST=localhost
TYPEORM_PORT=5432
TYPEORM_USERNAME=USER
TYPEORM_PASSWORD=PASS
TYPEORM_DATABASE=typescript-crud
TYPEORM_SYNCHRONIZE=true
TYPEORM_LOGGING=false
TYPEORM_ENTITIES=build/entity/*.js

Obs.: copy variables without passwords to .env.example

Create Record abstract entity

mkdir ./src/entity
code ./src/entity/Record.ts
import { Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export abstract class Record {
  @PrimaryGeneratedColumn()
  id: number;
}

Create Article entity

code ./src/entity/Article.ts
import { Entity, Column } from 'typeorm';
import { Record } from './Record';

@Entity()
export class Article extends Record {
  @Column()
  title: string;

  @Column()
  text: string;
}

Add logic to records controller

code ./src/controllers/records.ts
import { Repository } from 'typeorm';
import { Request, Response } from 'express';

export const recordsController = <T>(repository: Repository<T>) => {
  const findAll = async (req: Request, res: Response) => {
    // return all records
    const results = await repository.find();
    return res.send(results);
  };

  const findOne = async (req: Request, res: Response) => {
    // return one record by id
    const results = await repository.findOne(req.params.id);
    return res.send(results);
  };

  const create = async (req: Request, res: Response) => {
    // create a new record
    const record = repository.create(req.body);
    const results = await repository.save(record);
    return res.send(results);
  };

  const update = async (req: Request, res: Response) => {
    // update a record by a given id
    const record = await repository.findOne(req.params.id);
    repository.merge(record, req.body);
    const results = await repository.save(record);
    return res.send(results);
  };

  const remove = async (req: Request, res: Response) => {
    // delete a record by a given id
    const results = await repository.delete(req.params.id);
    return res.send(results);
  };

  return { findAll, findOne, create, update, remove };
};

Include repositories in article controller

code ./src/controllers/articles.ts
import { getRepository } from 'typeorm';
import { Article } from '../entity/Article';
import { recordsController } from './records';

export const articlesController = () => {
  const repository = getRepository(Article);

  return recordsController<Article>(repository);
};

Include database connection

code ./src/index.ts
import { createConnection } from 'typeorm';
import { config as configDotenv } from 'dotenv';
import { app } from './app';

configDotenv();

const port = parseInt(process.env.PORT);

const run = async () => {
  const connection = await createConnection();
  await app(port);
};

run();

Create database

createdb typescript-crud #postgres
#mysql -u USERNAME -p -e 'CREATE DATABASE `typescript-crud`'

Test application

yarn dev
curl -X POST -H "Content-Type: application/json" \
     -d '{"title":"First Article", "text":"First Article Text"}' \
     http://localhost:4000/articles
# {"title":"First Article","text":"First Article Text","id":1}
curl http://localhost:4000/articles
# [{"id":1,"title":"First Article","text":"First Article Text"}]

Commit

git add .
git commit -m "TypeORM"

Next step: Associations