Unlock the Power of MikroORM: A Step-by-Step Guide to Building a RESTful API
Getting Started
Before we dive in, let’s take a look at the technologies we’ll be using:
- Node.js: We’ll set up a Node.js server to run our JavaScript code. Make sure you have at least version 6.0.0 installed to take advantage of the latest ES6 features.
- Express.js: This fast and flexible Node.js web framework provides a robust set of features for web and mobile applications.
- PostgreSQL: We’ll use a powerful, open-source object-relational database system. For simplicity, we’ll set up an online instance at ElephantSQL.
- MikroORM: As stated on its website, MikroORM is a TypeScript ORM for Node.js based on Data Mapper, Unit of Work, and Identity Map patterns.
- Postman: This API platform simplifies each step of the API lifecycle and streamlines collaboration.
Setting Up the Project Structure
Let’s create the project structure using the following commands:
mkdir mikroorm-tutorial
cd mikroorm-tutorial
npm init -y
npm install express mikro-orm pg
After running these commands, you should have a project structure that looks like this:
mikroorm-tutorial/
mikro-orm.config.js
server/
app.js
...
Express.js Setup
In our app.js
file, we’ll bootstrap our Express.js application:
const express = require('express');
const app = express();
app.use(express.json());
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server started on port 3000');
});
MikroORM Setup
Next, we’ll set up our database connection in the mikro-orm.config.js
file:
import { MikroORM } from '@mikro-orm/core';
import { PostgreSqlDriver } from '@mikro-orm/postgresql';
const orm = await MikroORM.init({
driver: PostgreSqlDriver,
dbName: 'ydatabase',
user: 'yuser',
password: 'ypassword',
host: 'localhost',
port: 5432,
});
export default orm;
Defining Entities
MikroORM has the concept of a baseEntity. This is optional, but it helps in making some properties and fields reusable across all entities. Let’s define our Post
entity:
import { Entity, Property } from '@mikro-orm/core';
@Entity()
export class Post {
@Property()
title: string;
@Property()
content: string;
@Property()
author: string;
}
Controllers and Routing
Now that we’ve set up our entities and run the database migration, it’s time to create our controllers. We’ll make a postController
that will use the above entities’ definitions and will be responsible for carrying out CRUD operations on the Post
entity.
import { Controller, Get, Post, Put, Delete } from '@mikro-orm/core';
import { Post } from './Post';
@Controller('/posts')
export class PostController {
@Get()
async getAllPosts() {
const posts = await this.postRepository.findAll();
return posts;
}
@Post()
async createPost(@Body() post: Post) {
const newPost = await this.postRepository.create(post);
return newPost;
}
@Get('/:id')
async getPost(@Param('id') id: number) {
const post = await this.postRepository.findOne(id);
return post;
}
@Put('/:id')
async updatePost(@Param('id') id: number, @Body() post: Post) {
const updatedPost = await this.postRepository.update(id, post);
return updatedPost;
}
@Delete('/:id')
async deletePost(@Param('id') id: number) {
await this.postRepository.delete(id);
return 'Post deleted successfully!';
}
}
Testing the API
Let’s test our API using Postman. You can create, read, update, and delete posts using the following endpoints:
GET /posts
: Retrieve all postsPOST /posts
: Create a new postGET /posts/:id
: Retrieve a single postPUT /posts/:id
: Update a single postDELETE /posts/:id
: Delete a single post
Next Steps
If you’re building a real-world application with Node.js, Express, and MikroORM, you may want to consider adding things like authentication and authorization, better error handling, etc. You can also explore more advanced topics like relationship between entities, unit of work, transactions, etc.