restful_express_router
v0.0.4
Published
This is a simple function which takes a config object along with a mongoose model and return an express-router with a restful api
Readme
restful_express_router
The restful_express_router is a lightweight, flexible Node.js package that streamlines the creation of RESTful APIs by automatically generating Express routes for your Mongoose models. With minimal setup, it provides a complete CRUD (Create, Read, Update, Delete) API interface, making it perfect for rapid development while maintaining customization options.
Main objective is to keep things very simple and provide a boilerplate to create RESTful Express Routers using mongoose Features
- Automatic Route Generation: Creates standardized RESTful endpoints for all CRUD operations
- Flexible Middleware Support: Add custom middleware for authentication, logging, or any other purpose
- Advanced Query Capabilities: Built-in support for:
- Pagination
- Sorting
- Field selection
- Custom filters
- Customizable: Easy to extend with additional routes and custom handlers
- MongoDB/Mongoose Integration: Seamless integration with your existing Mongoose models
Installation
Install the package using npm:
npm install restful_express_routerUsage Example
Below is a basic example demonstrating how to create a complete REST API for a User model:
require('dotenv').config();
const mongoose = require('mongoose');
const express = require('express');
const RestfulExpressRouter = require('restful_express_router');
const app = express();
app.use(express.json());
// Define a simple Mongoose model
const UserSchema = new mongoose.Schema({
email: String,
password: String,
});
const User = mongoose.model('User', UserSchema);
let restfulExpressRouter = new RestfulExpressRouter(User);
app.use('/users', restfulExpressRouter.getRouter());
app.get('/', (req, res) => res.status(200).json({ message: "Welcome to ExpressRestRouter 0.0.1" }));
// Start the server
const PORT = 5000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
API Manual
Available Endpoints
Query Parameters
When retrieving lists (GET /), the following query parameters are supported:
- sort (string): Sort by any field. Prefix with
-for descending order- Example:
sort=-createdAtorsort=email
- Example:
- limit (number): Number of items per page (default: 10)
- Example:
limit=20
- Example:
- page (number): Page number for pagination (default: 1)
- Example:
page=2
- Example:
- fields (string): Comma-separated list of fields to include
- Example:
fields=email,createdAt
- Example:
- filters: Any model field can be used as a filter
- Example:
status=active&role=admin
- Example:
Middleware Functionality
The RestfulExpressRouter provides a flexible middleware system that allows you to:
- Add authentication to specific routes
- Log requests
- Validate input data
- Transform responses
- Handle errors
Middleware Configuration
Each route type can have its own middleware chain:
Advanced Example
The following example demonstrates how to implement authentication, logging, and custom routes:
require('dotenv').config();
const db = require("./mongo.js");
const mongoose = require('mongoose');
const express = require('express');
const RestfulExpressRouter = require('restful_express_router');
const jwt = require('jsonwebtoken');
const login = require('./src/login.js');
const UserSchema = require('./src/UserSchema.js');
const User = mongoose.model('User', UserSchema);
//////////////////////////////
const app = express();
app.use(express.json());
//==Middlewhere
const logRequest = (req, res, next) => {
// debugger;
console.log(`Request Method: ${req.method}, URL: ${req.url}`);
next(); // Proceed to the next middleware or route handler
};
// Middleware for Auth
const authenticateJWT = (req, res, next) => {
debugger;
const token = req.headers['authorization']?.split(' ')[1];
if (!token) {
return res.sendStatus(403); // Forbidden if no token
}
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) {
console.log(`Verified: ${req.method}, URL: ${req.url}`);
return res.sendStatus(403); // Forbidden if token is not valid
}
req.user = user; // Save user info in request object
next(); // Proceed to the next middleware or route handler
});
};
///////////////////////////////////////////////
let restfulExpressRouter = new RestfulExpressRouter(User);
restfulExpressRouter.middlewareForList = [logRequest];
restfulExpressRouter.middlewareForGetById = [logRequest];
restfulExpressRouter.middlewareForUpdate = [authenticateJWT];
restfulExpressRouter.addExtraRoute(
{
method: 'post',
path: '/login',
middlewares: [], // Optional: add any middlewares
handler: async function(req, res) {
debugger;
const rez = await login(req,res);
return rez;
// res.status(200).json({ message: 'This is an additional route (login)' });
}
}
);
////----Here it all comes together
app.use('/users', restfulExpressRouter.getRouter());
app.get('/', (req, res) => res.status(200).json({ message: "Welcome to ExpressRestRouter 0.0.1" }));
// Start the server
const PORT = 5000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Error Handling
The router provides consistent error responses:
- 404: Resource not found
- Returned when requesting non-existent items
- 500: Internal server error
- Returned for database errors or unexpected issues
- 400: Bad request
- Returned for invalid input data
- 403: Forbidden
- Returned for authentication/authorization failures
License
This project is licensed under the MIT License.
Author
Bilal Tariq
