Node.js Route-Controller-Service structure for ExpressJS

Model-Routes-Controllers-Services Directory Structure

│   ├───user.model.js
│   ├───user.route.js
│   ├───user.service.js
│   ├───user.controller.js

For modular code structure the logic should be divided into these directories and files.

Models - The schema definition of the Model

Routes - The API routes maps to the Controllers

Controllers - The controllers handles all the logic behind validating request parameters, query, Sending Responses with correct codes.

Services - The services contains the database queries and returning objects or throwing errors

This coder will end up writing more codes. But at the end the codes will be much more maintainable and seperated.

Model-Routes-Controllers-Services Code Structure


var mongoose = require('mongoose')

const UserSchema  = new mongoose.Schema({
    name: String

const User = mongoose.model('User', UserSchema)

module.exports = User;


var express = require('express');
var router = express.Router();

var UserController = require('../controllers/user.controller')

router.get('/', UserController.getUsers)

module.exports = router;


var UserService = require('../services/user.service')    

exports.getUsers = async function (req, res, next) {
    // Validate request parameters, queries using express-validator
    var page = ? : 1;
    var limit = req.params.limit ? req.params.limit : 10;
    try {
        var users = await UserService.getUsers({}, page, limit)
        return res.status(200).json({ status: 200, data: users, message: "Succesfully Users Retrieved" });
    } catch (e) {
        return res.status(400).json({ status: 400, message: e.message });

var User = require('../models/user.model')

exports.getUsers = async function (query, page, limit) {

    try {
        var users = await User.find(query)
        return users;
    } catch (e) {
        // Log Errors
        throw Error('Error while Paginating Users')