Пример использования 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.