Building a REST API is a fundamental skill for backend development. In this article, I’ll walk through how to create a simple REST API using Node.js and Express.js. This guide will provide you with a clear, step-by-step process to build your first API.
NOTE: This tutorial does not integrate any database instead it uses an In-memory array
What is a REST API?
A REST API (Representational State Transfer Application Programming Interface) is a set of rules and conventions for building and interacting with web services. It uses HTTP methods like GET, POST, PUT, and DELETE to perform operations on resources, typically returning data in JSON format.
Prerequisites
Before we begin, make sure you have the following installed:
- Node.js: Download and install it from nodejs.org.
- A Code Editor: Use any editor you prefer, such as Visual Studio Code, Sublime Text, or Atom.
- Postman (optional): A tool to test your API endpoints. Download it from postman.com.
Step 1: Set Up Your Project
1. Create a Project Directory
Open your terminal and create a new directory for your project:
mkdir my-rest-api
cd my-rest-api
2. Initialize a Node.js Project
Run the following command to create a package.json file:
npm init -y
The -y flag automatically fills in default values for your project.
Step 2: Install Required Packages
1. Install Express.js
Express.js is a lightweight web framework for Node.js. Install it using:
npm install express
2. Install Nodemon (Optional)
Nodemon automatically restarts your server whenever you make changes to your code. Install it as a development dependency:
npm install --save-dev nodemon
Step 3: Create the Basic Server
1. Create an index.js File
In your project directory, create a file named index.js:
touch index.js
2. Set Up the Server
Open index.js and add the following code:
// Import the express module
const express = require('express');
// Create an instance of express
const app = express();
// Define the port number
const PORT = 3000;
// Middleware to parse JSON bodies
app.use(express.json());
// Define a simple route
app.get('/', (req, res) => {
res.send('Hello, World!');
});
// Start the server and listen on the specified port
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
3. Run the Server
Start the server using:
node index.js
If you installed Nodemon, use:
npx nodemon index.js
Visit http://localhost:3000 in your browser, and you should see "Hello, World!".
Step 4: Add CRUD Operations
Let’s create a simple REST API for managing a list of items. We’ll use an in-memory array to store the data.
1. Create an In-Memory Array
Add this line after app.use(express.json());:
let items = [];
2. Define CRUD Routes
GET /items: Get All Items
app.get('/items', (req, res) => {
res.json(items);
});
GET /items/:id: Get a Single Item by ID
app.get('/items/:id', (req, res) => {
const itemId = parseInt(req.params.id);
const item = items.find(i => i.id === itemId);
if (!item) {
return res.status(404).json({ message: 'Item not found' });
}
res.json(item);
});
POST /items: Create a New Item
app.post('/items', (req,res) => {
const newItem = {
id: items.length + 1,
name: req.body.name
};
items.push(newItem);
res.status(201).json({message:'Item added successful',data:newItem});
});
PUT /items/:id: Update an Item by ID
app.put('/items/:id', (req, res) => {
const itemId = parseInt(req.params.id);
const item = items.find(i => i.id === itemId);
// Check if the item exists
if (!item) {
return res.status(404).json({ message: 'Item not found' });
}
// Update the item's name
item.name = req.body.name;
// Return the updated item
res.json(item);
});
DELETE /items/:id: Delete an Item by ID
app.delete('/items/:id', (req, res) => {
const itemId = parseInt(req.params.id);
const itemIndex = items.findIndex(i => i.id === itemId);
if (itemIndex === -1) {
return res.status(404).json({ message: 'Item not found' });
}
items.splice(itemIndex, 1);
res.status(204).send();
});
Step 5: Test Your API
Use Postman or cURL to test your API endpoints:
-
GET
http://localhost:3000/items– Retrieve all items. -
POST
http://localhost:3000/items– Create a new item. Send a JSON body like{ "name": "Item 1" }. -
GET
http://localhost:3000/items/1– Retrieve a single item by ID. -
PUT
http://localhost:3000/items/1– Update an item. Send a JSON body like{ "name": "Updated Item 1" }. -
DELETE
http://localhost:3000/items/1– Delete an item by ID.
Step 6: Add Error Handling (Optional)
To handle errors globally, add this middleware at the end of your index.js file:
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ message: 'Something went wrong!' });
});
Step 7: Organize Your Code (Optional)
As your project grows, you can organize your code into separate files and folders. For example:
-
routes/: Define routes. -
controllers/: Handle business logic. -
models/: Define data structures.
Final Code
Here’s the complete index.js file:
const express = require('express');
const app = express();
const PORT = 3000;
app.use(express.json());
let items = [];
// GET all items
app.get('/items', (req, res) => {
res.json(items);
});
// GET a single item by ID
app.get('/items/:id', (req, res) => {
const itemId = parseInt(req.params.id);
const item = items.find(i => i.id === itemId);
if (!item) {
return res.status(404).json({ message: 'Item not found' });
}
res.json(item);
});
// POST a new item
app.post('/items', (req,res) => {
const newItem = {
id: items.length + 1,
name: req.body.name
};
items.push(newItem);
res.status(201).json({message:'Item added successful',data:newItem});
});
// PUT (update) an item by ID
app.put('/items/:id', (req, res) => {
const itemId = parseInt(req.params.id);
const item = items.find(i => i.id === itemId);
// Check if the item exists
if (!item) {
return res.status(404).json({ message: 'Item not found' });
}
// Update the item's name
item.name = req.body.name;
// Return the updated item
res.json(item);
});
// DELETE an item by ID
app.delete('/items/:id', (req, res) => {
const itemId = parseInt(req.params.id);
const itemIndex = items.findIndex(i => i.id === itemId);
if (itemIndex === -1) {
return res.status(404).json({ message: 'Item not found' });
}
items.splice(itemIndex, 1);
res.status(204).send();
});
// Error handling middleware
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ message: 'Something went wrong!' });
});
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
Conclusion
Congratulations! You’ve built a simple REST API using Node.js and Express.js. This is just the beginning—there’s so much more you can do, like integrating a database, adding authentication, or deploying your API to the cloud.
Keep experimenting, and happy coding!
Top comments (0)