Building a REST API with Node.js: Complete Tutorial

<h2>Introduction</h2>

<p>Building a REST API is a fundamental skill for modern web developers. This tutorial will guide you through creating a production-ready API with Node.js, Express, and MongoDB.</p>

<h2>Prerequisites</h2>

<ul>

<li>Node.js 18+ installed</li>

<li>Basic JavaScript knowledge</li>

<li>MongoDB Atlas account (free tier)</li>

</ul>

<h2>Project Setup</h2>

<p>Start by creating a new project and installing dependencies:</p>

<pre><code>mkdir my-api && cd my-api

npm init -y

npm install express mongoose dotenv cors helmet

npm install --save-dev nodemon</code></pre>

<h2>Creating the Express Server</h2>

<p>Create an <code>index.js</code> file with a basic Express server:</p>

<pre><code>const express = require('express');

const mongoose = require('mongoose');

const cors = require('cors');

const helmet = require('helmet');

require('dotenv').config();

const app = express();

app.use(helmet());

app.use(cors());

app.use(express.json());

app.get('/api/health', (req, res) => {

  res.json({ status: 'ok' });

});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => console.log(`Server running on port ${PORT}`));</code></pre>

<h2>Database Connection</h2>

<p>Connect to MongoDB using Mongoose:</p>

<pre><code>mongoose.connect(process.env.MONGODB_URI)

  .then(() => console.log('Connected to MongoDB'))

  .catch(err => console.error('MongoDB connection error:', err));</code></pre>

<h2>Creating Models</h2>

<p>Define a simple User model:</p>

<pre><code>const userSchema = new mongoose.Schema({

  name: { type: String, required: true },

  email: { type: String, required: true, unique: true },

  createdAt: { type: Date, default: Date.now }

});

module.exports = mongoose.model('User', userSchema);</code></pre>

<h2>Implementing CRUD Routes</h2>

<pre><code>// Create user

app.post('/api/users', async (req, res) => {

  try {

    const user = await User.create(req.body);

    res.status(201).json(user);

  } catch (error) {

    res.status(400).json({ error: error.message });

  }

});

// Get all users

app.get('/api/users', async (req, res) => {

  const users = await User.find();

  res.json(users);

});</code></pre>

<h2>Error Handling</h2>

<p>Implement a global error handler:</p>

<pre><code>app.use((err, req, res, next) => {

  console.error(err.stack);

  res.status(500).json({ error: 'Something went wrong!' });

});</code></pre>

<h2>Conclusion</h2>

<p>You now have a basic REST API with Node.js. Add authentication, validation, and tests to make it production-ready!</p>