How to Make API using NodeJS and Express
Tags: node
Published: 2023-09-21 06:32:11

### Setting Up the Project

1. **Initial Setup**:
    ```bash
    mkdir node-express-api
    cd node-express-api
    npm init -y
    ```

2. **Install Required Packages**:
    ```bash
    npm install express mongoose
    ```

### Folder Structure

- node-express-api
    - models
    - controllers
    - routes
    - app.js

### Models

**1. User Model (models/user.js)**

```javascript
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    name: String,
    email: String,
    password: String,
});

module.exports = mongoose.model('User', userSchema);
```

**2. Product Model (models/product.js)**

```javascript
const mongoose = require('mongoose');

const productSchema = new mongoose.Schema({
    name: String,
    price: Number,
    category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category' }
});

module.exports = mongoose.model('Product', productSchema);
```

**3. Category Model (models/category.js)**

```javascript
const mongoose = require('mongoose');

const categorySchema = new mongoose.Schema({
    name: String,
});

module.exports = mongoose.model('Category', categorySchema);
```

### Controllers

**1. User Controller (controllers/userController.js)**

```javascript
const User = require('../models/user');

exports.createUser = async (req, res) => {
    try {
        const user = new User(req.body);
        await user.save();
        res.status(201).json(user);
    } catch (error) {
        res.status(400).json({ error: error.message });
    }
};
```

**2. Product Controller (controllers/productController.js)**

```javascript
const Product = require('../models/product');

exports.createProduct = async (req, res) => {
    try {
        const product = new Product(req.body);
        await product.save();
        res.status(201).json(product);
    } catch (error) {
        res.status(400).json({ error: error.message });
    }
};
```

**3. Category Controller (controllers/categoryController.js)**

```javascript
const Category = require('../models/category');

exports.createCategory = async (req, res) => {
    try {
        const category = new Category(req.body);
        await category.save();
        res.status(201).json(category);
    } catch (error) {
        res.status(400).json({ error: error.message });
    }
};
```

### Routes

**Routes Setup (routes/index.js)**

```javascript
const express = require('express');
const userController = require('../controllers/userController');
const productController = require('../controllers/productController');
const categoryController = require('../controllers/categoryController');

const router = express.Router();

router.post('/users', userController.createUser);
router.post('/products', productController.createProduct);
router.post('/categories', categoryController.createCategory);

module.exports = router;
```

### Bringing It All Together

**app.js**

```javascript
const express = require('express');
const mongoose = require('mongoose');
const routes = require('./routes');

const app = express();

mongoose.connect('mongodb://localhost:27017/node-express-api', { useNewUrlParser: true, useUnifiedTopology: true });

app.use(express.json());
app.use('/api', routes);

const PORT = 3000;
app.listen(PORT, () => {
    console.log(`Server running on http://localhost:${PORT}`);
});
```

Now, after setting up the above structure, you have the basic building blocks for an API in Node.js and Express. You can run the app with:

```bash
node app.js
```

Remember, this is a basic structure, and there's much more you can do, such as adding error handling, validation, authentication, etc. I hope this provides a solid starting point!