Install the package using npm:
npm install crud-api-express
This project provides a flexible and reusable CRUD (Create, Read, Update, Delete) API controller for MongoDB using Express.js and Mongoose.
The CrudController
class simplifies the creation of RESTful APIs in Node.js applications using MongoDB. It abstracts away common CRUD operations, error handling, middleware integration, and supports custom routes and aggregation pipelines.
Here's a basic example of how to use in Es module CrudController
:
import express from 'express';
import mongoose from 'mongoose';
import CrudController from 'crud-api-express';
const Schema = mongoose.Schema;
const ExampleSchema = new Schema(
{
type: { type: String, default: 'Percentage', enum: ['Percentage', 'Flat'] },
status: { type: String, default: 'Active', trim: true },
expiry_date: { type: Date, index: true, trim: true },
},
{ timestamps: true, versionKey: false }
);
const ExampleModel = mongoose.model('Example', ExampleSchema);
const options = {
middleware: [
(req, res, next) => {
const authToken = req.headers.authorization;
if (!authToken) {
return res.status(401).json({ message: 'Unauthorized' });
}
next();
},
(req, res, next) => {
console.log(`Request received at ${new Date()}`);
next();
},
],
onSuccess: (res, method, result) => {
console.log(`Successful ${method} operation:`, result);
res.status(200).json({ success: true, data: result });
},
onError: (res, method, error) => {
console.error(`Error in ${method} operation:`, error);
res.status(500).json({ error: error.message });
},
methods: ['GET', 'POST', 'PUT', 'DELETE'],
aggregatePipeline: [
{ $match: { status: 'Active' } },
{ $sort: { createdAt: -1 } },
],
customRoutes: [
{
method: 'get',
path: '/custom-route',
handler: (req, res) => {
res.json({ message: 'Custom route handler executed' });
},
},
{
method: 'post',
path: '/custom-action',
handler: (req, res) => {
res.json({ message: 'Custom action executed' });
},
},
],
};
const exampleController = new CrudController(ExampleModel, 'examples', options);
const mongoURI = 'mongodb://localhost:27017/mydatabase';
mongoose
.connect(mongoURI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
console.log('Connected to MongoDB');
const app = express();
app.use(express.json());
app.use('/api', exampleController.getRouter());
console.log(exampleController.getRoutes());
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
})
.catch((err) => {
console.error('Error connecting to MongoDB:', err.message);
process.exit(1);
});
Here's a basic example of how to use in cjs module CrudController
:
const express = require('express');
const mongoose = require('mongoose');
const CrudController = require('crud-api-express');
const Schema = mongoose.Schema;
const ExampleSchema = new Schema(
{
type: { type: String, default: 'Percentage', enum: ['Percentage', 'Flat'] },
status: { type: String, default: 'Active', trim: true },
expiry_date: { type: Date, index: true, trim: true },
},
{ timestamps: true, versionKey: false }
);
const ExampleModel = mongoose.model('Example', ExampleSchema);
const options = {
middleware: [
(req, res, next) => {
const authToken = req.headers.authorization;
if (!authToken) {
return res.status(401).json({ message: 'Unauthorized' });
}
next();
},
(req, res, next) => {
console.log(`Request received at ${new Date()}`);
next();
},
],
onSuccess: (res, method, result) => {
console.log(`Successful ${method} operation:`, result);
res.status(200).json({ success: true, data: result });
},
onError: (res, method, error) => {
console.error(`Error in ${method} operation:`, error);
res.status(500).json({ error: error.message });
},
methods: ['GET', 'POST', 'PUT', 'DELETE'],
aggregatePipeline: [
{ $match: { status: 'Active' } },
{ $sort: { createdAt: -1 } },
],
customRoutes: [
{
method: 'get',
path: '/custom-route',
handler: (req, res) => {
res.json({ message: 'Custom route handler executed' });
},
},
{
method: 'post',
path: '/custom-action',
handler: (req, res) => {
res.json({ message: 'Custom action executed' });
},
},
],
};
const exampleController = new CrudController(ExampleModel, 'examples', options);
const mongoURI = 'mongodb://localhost:27017/mydatabase';
mongoose
.connect(mongoURI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
console.log('Connected to MongoDB');
const app = express();
app.use(express.json());
app.use('/api', exampleController.getRouter());
console.log(exampleController.getRoutes());
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
})
.catch((err) => {
console.error('Error connecting to MongoDB:', err.message);
process.exit(1);
});
Returns the Express Router instance configured with CRUD routes.
[
{ "method": "POST", "path": "/examples", "params": null },
{ "method": "GET", "path": "/examples", "params": ["filter", "sort", "page", "limit"] },
{ "method": "GET", "path": "/examples/:id", "params": ["id"] },
{ "method": "PUT", "path": "/examples/:id", "params": ["id"] },
{ "method": "DELETE", "path": "/examples", "params": ["filter"] },
{ "method": "DELETE", "path": "/examples/:id", "params": ["id"] },
{ "method": "GET", "path": "/examples/aggregate", "params": null },
{ "method": "GET", "path": "/examples/custom-route", "params": null },
{ "method": "POST", "path": "/examples/custom-action", "params": null }
]
Option | Type | Description |
---|---|---|
middleware |
((req: Request, res: Response, next: NextFunction) => void)[] |
Array of middleware functions |
onSuccess |
(res: Response, method: string, result: T | T[]) => void |
Success handler function |
onError |
(res: Response, method: string, error: Error) => void |
Error handler function |
methods |
('POST' | 'GET' | 'PUT' | 'DELETE')[] |
Array of HTTP methods to support |
relatedModel |
Model<any> |
Related Mongoose model for relational operations |
relatedField |
string |
Field name for related models |
relatedMethods |
('POST' | 'GET' | 'PUT' | 'DELETE')[] |
Methods to apply on related models |
aggregatePipeline |
object[] |
MongoDB aggregation pipeline stages |
customRoutes |
{ method: 'post' | 'get' | 'put' | 'delete', path: string, handler: (req: Request, res: Response) => void }[] |
Array of custom route definitions |
🛠️ URL:
GET http://localhost:3000/api/examples?filter={"status":"Active"}&sort={"expiry_date":1}&page=1&limit=10
-
filter
→ Filter results (e.g.,{ "status": "Active" }
). -
sort
→ Sort order (e.g.,{ "expiry_date": 1 }
for ascending). -
page
→ Pagination (e.g.,page=1
). -
limit
→ Number of results per page.
This project is licensed under the ISC License.
If you find this package useful, consider supporting me:
Buy Me a Coffee ☕