# Example using TypeORM with Express
# Initial setup
Let's create a simple application called "user" which stores users in the database and allows us to create, update, remove, and get a list of all users, as well as a single user by id within web api.
First, create a directory called "user":
mkdir user
Then switch to the directory and create a new project:
cd user
npm init
2
Finish the init process by filling in all required application information.
Now we need to install and setup a TypeScript compiler. Lets install it first:
npm i typescript --save-dev
Then let's create a tsconfig.json
file which contains the configuration required for the application to
compile and run. Create it using your favorite editor and put the following configuration:
{
"compilerOptions": {
"lib": ["es5", "es6", "dom"],
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true
}
}
2
3
4
5
6
7
8
9
10
Now let's create a main application endpoint - app.ts
inside the src
directory:
mkdir src
cd src
touch app.ts
2
3
Let's add a simple console.log
inside it:
console.log("Application is up and running")
Now it's time to run our application. To run it, you need to compile your typescript project first:
tsc
Once you compile it, you should have a src/app.js
file generated.
You can run it using:
node src/app.js
You should see the, "Application is up and running" message in your console right after you run the application.
You must compile your files each time you make a change. Alternatively, you can set up watcher or install ts-node (opens new window) to avoid manual compilation each time.
# Adding Express to the application
Let's add Express to our application. First, let's install the packages we need:
npm i express @types/express --save
express
is the express engine itself. It allows us to create a web api@types/express
is used to have a type information when using express
Let's edit the src/app.ts
file and add express-related logic:
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)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Now you can compile and run your project. You should have an express server running now with working routes. However, those routes do not return any content yet.
# Adding TypeORM to the application
Finally, let's add TypeORM to the application.
In this example, we will use mysql
driver.
Setup process for other drivers is similar.
Let's install the required packages first:
npm i typeorm mysql reflect-metadata --save
typeorm
is the typeorm package itselfmysql
is the underlying database driver. If you are using a different database system, you must install the appropriate packagereflect-metadata
is required to make decorators to work properly
Let's create app-data-source.ts
where we set up initial database connection options:
import { DataSource } from "typeorm"
const myDataSource = new DataSource({
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test",
entities: ["src/entity/*.js"],
logging: true,
synchronize: true,
})
2
3
4
5
6
7
8
9
10
11
12
13
Configure each option as you need. Learn more about options here.
Let's create a user.entity.ts
entity inside src/entity
:
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
}
2
3
4
5
6
7
8
9
10
11
12
13
Let's change src/app.ts
to establish database connection and start using myDataSource
:
import * as express from "express"
import { Request, Response } from "express"
import { User } from "./entity/User"
import { myDataSource } from "./app-data-source.ts"
// establish database connection
myDataSource
.initialize()
.then(() => {
console.log("Data Source has been initialized!")
})
.catch((err) => {
console.error("Error during Data Source initialization:", err)
})
// 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)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Now you should have a basic express application connected to MySQL database up and running.