Перейти к основному содержанию

Пример использования TypeORM с Express

Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

Начальная настройка

Давайте создадим простое приложение "user", которое хранит пользователей в базе данных и позволяет создавать, обновлять, удалять, получать список всех пользователей, а также отдельных пользователей по id через веб-API.

Сначала создадим директорию с названием "user":

mkdir user

Перейдём в эту директорию и инициализируем новый проект:

cd user
npm init

Завершите процесс инициализации, заполнив всю необходимую информацию о приложении.

Теперь нам нужно установить и настроить компилятор TypeScript. Сначала установим его:

npm i typescript --save-dev

Затем создадим файл tsconfig.json, содержащий конфигурацию, необходимую для компиляции и запуска приложения. Создайте его в любом редакторе и добавьте следующую конфигурацию:

{
"compilerOptions": {
"lib": ["es5", "es6", "dom"],
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true
}
}

Теперь создадим основную точку входа приложения - app.ts внутри директории src:

mkdir src
cd src
touch app.ts

Добавим простой console.log внутри:

console.log("Application is up and running")

Теперь пришло время запустить наше приложение. Для этого сначала нужно скомпилировать TypeScript-проект:

tsc

После компиляции будет сгенерирован файл src/app.js. Запустить его можно командой:

node src/app.js

Сразу после запуска приложения в консоли вы увидите сообщение "Application is up and running".

Компилировать файлы необходимо после каждого изменения. В качестве альтернативы можно настроить watcher или установить ts-node, чтобы избежать ручной компиляции.

Добавление Express в приложение

Добавим Express в наше приложение. Сначала установим необходимые пакеты:

npm install express
npm install @types/express --save-dev
  • express — это сам движок Express. Он позволяет создавать веб-API

  • @types/express предоставляет информацию о типах при работе с Express

Отредактируем файл src/app.ts и добавим логику работы с Express:

import * as express from "express"
import { Request, Response } from "express"

// create and setup express app
const app = express()
app.use(express.json())

// register routes

app.get("/users", function (req: Request, res: Response) {
// here we will have logic to return all users
})

app.get("/users/:id", function (req: Request, res: Response) {
// here we will have logic to return user by id
})

app.post("/users", function (req: Request, res: Response) {
// here we will have logic to save a user
})

app.put("/users/:id", function (req: Request, res: Response) {
// here we will have logic to update a user by a given user id
})

app.delete("/users/:id", function (req: Request, res: Response) {
// here we will have logic to delete a user by a given user id
})

// start express server
app.listen(3000)

Теперь можно скомпилировать и запустить проект. У вас должен запуститься Express-сервер с рабочими роутами. Пока эти роуты не возвращают никакого содержимого.

Добавление TypeORM в приложение

Наконец, добавим TypeORM в приложение. В этом примере мы будем использовать драйвер mysql. Процесс настройки для других драйверов аналогичен.

Сначала установим необходимые пакеты:

npm install typeorm reflect-metadata mysql
  • typeorm — основной пакет TypeORM

  • reflect-metadata необходим для корректной работы декораторов. Всегда импортируйте его перед кодом TypeORM

  • mysql — драйвер базы данных. При использовании другой СУБД установите соответствующий пакет

Создадим app-data-source.ts для настройки параметров подключения к базе данных:

import { DataSource } from "typeorm"

export const myDataSource = new DataSource({
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test",
entities: [__dirname + "/entities/**/*{.js,.ts}"],
logging: true,
synchronize: true,
})

Настройте каждую опцию по своему усмотрению. Подробнее о параметрах читайте здесь.

Создадим сущность user.entity.ts в папке entities:

import { Entity, Column, PrimaryGeneratedColumn } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number

@Column()
firstName: string

@Column()
lastName: string
}

Изменим src/app.ts для установки соединения с базой данных и работы с myDataSource:

import "reflect-metadata"

import * as express from "express"
import { Request, Response } from "express"
import { User } from "./entities/User"
import { myDataSource } from "./app-data-source.ts"

// establish database connection
try {
await myDataSource.initialize()
console.log("Data Source has been initialized!")
} catch (error) {
console.error("Error during Data Source initialization:", error)
}

// create and setup express app
const app = express()
app.use(express.json())

// register routes
app.get("/users", async function (req: Request, res: Response) {
const users = await myDataSource.getRepository(User).find()
res.json(users)
})

app.get("/users/:id", async function (req: Request, res: Response) {
const results = await myDataSource.getRepository(User).findOneBy({
id: req.params.id,
})
return res.send(results)
})

app.post("/users", async function (req: Request, res: Response) {
const user = await myDataSource.getRepository(User).create(req.body)
const results = await myDataSource.getRepository(User).save(user)
return res.send(results)
})

app.put("/users/:id", async function (req: Request, res: Response) {
const user = await myDataSource.getRepository(User).findOneBy({
id: req.params.id,
})
myDataSource.getRepository(User).merge(user, req.body)
const results = await myDataSource.getRepository(User).save(user)
return res.send(results)
})

app.delete("/users/:id", async function (req: Request, res: Response) {
const results = await myDataSource.getRepository(User).delete(req.params.id)
return res.send(results)
})

// start express server
app.listen(3000)

Теперь у вас должно быть базовое Express-приложение, подключённое к MySQL.