data-validation-proximity
v1.3.8
Published
A library of Joi-based validation middlewares for Express.js
Readme
Data Validation Proximity
A comprehensive library of Joi-based validation middlewares for Express.js applications, specifically designed for e-commerce platforms with complex data structures.
Installation
npm install data-validation-proximityDependencies
This package requires Joi for validation:
npm install joi@^17.xUsage
Basic Setup
const express = require('express');
const {
validateUser,
validateProduct,
validateStore
} = require('data-validation-proximity');
const app = express();
app.use(express.json());
// Apply validation middleware to routes
app.post('/api/users', validateUser, (req, res) => {
// req.body is validated
res.json({ message: 'User created' });
});
app.post('/api/products', validateProduct, (req, res) => {
// req.body is validated and preprocessed
res.json({ message: 'Product created' });
});
app.post('/api/stores', validateStore, (req, res) => {
// req.body is validated
res.json({ message: 'Store created' });
});Available Validation Middlewares
User & Authentication
validateUser- Validates user registration/creationvalidateUserUpdate- Validates user profile updatesvalidateLogin- Validates login credentialsvalidateResetPassword- Validates password reset requests
Store Management
validateStore- Validates store creation with full detailsvalidateStoreUpdate- Validates store information updatesvalidateStoreCategory- Validates store category datavalidateStoreRate- Validates store rating submissions
Product Management
validateProduct- Validates product creation with images and variantsvalidateProductUpdate- Validates product updatesvalidateCategory- Validates product category data
Orders & Transactions
validateOrder- Validates order placementvalidateCart- Validates shopping cart datavalidateBill- Validates billing informationvalidatePayment- Validates payment transactionsvalidatePaymentType- Validates payment method types
Promotions & Offers
validateOffer- Validates special offers/promotionsvalidateFlashDeal- Validates flash sale dealsvalidateReductionOffer- Validates discount offers
Subscriptions
validatePlan- Validates subscription plansvalidateSubscription- Validates subscription datavalidateSubscriptionOffer- Validates subscription offer details
Other
validateNotification- Validates notification datavalidateSale- Validates sales recordsvalidateView- Validates view tracking datavalidateUserAction- Validates user activity tracking
Features
Automatic Data Preprocessing
The library includes intelligent preprocessing for complex data:
JSON Field Parsing
Automatically parses stringified JSON fields:
// Before validation, string fields are parsed to objects
app.post('/api/products', validateProduct, (req, res) => {
// req.body.variants: "[{...}]" → [{...}]
// req.body.policy: "{...}" → {...}
});File Array Normalization
Normalizes file uploads for consistent handling:
// Single file uploads are converted to arrays
app.post('/api/products', validateProduct, (req, res) => {
// req.files.images: single file → [file]
// req.files.varientsImages: single file → [file]
});Complex Schema Support
Address Schema
{
latitude: Number,
longitude: Number,
countryCode: String (min 2 chars),
country: String (min 3 chars),
city: String (min 3 chars),
streetName: String (min 3 chars),
postalCode: String (min 3 chars),
fullAdress: String,
region: String,
apartmentNumber: String
}Working Time Schema
{
option: String (required),
fixedHours: [{
openTime: String,
closeTime: String
}],
customizedHours: {
[dayName]: [{
openTime: String,
closeTime: String
}]
}
}Policy Schema
Comprehensive policy validation for:
- Working hours
- Pickup policies
- Delivery options
- Reservation rules (duration, payment, cancellation)
- Return policies (duration, conditions, refunds)
- Order management (validation, notifications)
Role Validation
Built-in support for role-based validation:
// Valid roles: 'user', 'admin', 'seller', 'paymentManager', 'manager', 'SuperManager'Examples
User Registration
const { validateUser } = require('data-validation-proximity');
app.post('/api/register', validateUser, async (req, res) => {
// req.body contains validated data:
// - username, email, password, phone
// - optional: address, profileImage, etc.
const user = await User.create(req.body);
res.status(201).json(user);
});Product Creation
const { validateProduct } = require('data-validation-proximity');
app.post('/api/products', validateProduct, async (req, res) => {
// Automatically preprocessed:
// - JSON strings parsed to objects
// - File arrays normalized
// - Validated: name, price, category, variants, policy
const product = await Product.create(req.body);
res.status(201).json(product);
});Store Setup
const { validateStore } = require('data-validation-proximity');
app.post('/api/stores', validateStore, async (req, res) => {
// Validated data includes:
// - store details (name, description, category)
// - address with coordinates
// - working hours
// - policies
// - payment methods
const store = await Store.create(req.body);
res.status(201).json(store);
});Order Placement
const { validateOrder } = require('data-validation-proximity');
app.post('/api/orders', validateOrder, async (req, res) => {
// Validated: products, amounts, addresses, payment info
const order = await Order.create(req.body);
res.status(201).json(order);
});Error Handling
Validation errors return a 400 status with detailed error messages:
// Invalid request
{
"error": "\"email\" must be a valid email"
}
// Multiple validation errors
{
"error": "\"price\" must be a positive number"
}Integration with Custom Error Library
Works seamlessly with custom-error-library:
const { errorMiddleware } = require('custom-error-library');
const { validateProduct } = require('data-validation-proximity');
app.post('/api/products', validateProduct, createProduct);
// Error middleware handles validation errors
app.use(errorMiddleware);Advanced Usage
Custom Validation Middleware
You can create custom validation middlewares using the exported helper:
const { createValidationMiddleware } = require('data-validation-proximity');
const Joi = require('joi');
const customSchema = Joi.object({
customField: Joi.string().required()
});
const validateCustom = createValidationMiddleware(customSchema);
app.post('/api/custom', validateCustom, handler);Preprocessing Hooks
For complex data transformations, validation middlewares include preprocessing:
// Example: Product validation with preprocessing
// 1. Parses JSON strings (variants, policy, etc.)
// 2. Normalizes file arrays
// 3. Validates against schema
// 4. Passes to route handlerBest Practices
- Apply validation early - Use validation middleware before business logic
- Combine with error handling - Use with
custom-error-libraryfor consistent errors - Use appropriate validators - Choose specific validators (validateUser vs validateUserUpdate)
- Handle file uploads - Validation automatically normalizes file arrays
- Trust preprocessed data - Data is cleaned and parsed before validation
Schema Reference
Common Field Types
| Field Type | Validation Rules | Example |
|------------|-----------------|---------|
| Email | Valid email format | [email protected] |
| Phone | String, min 8 chars | +1234567890 |
| Password | String, min 6 chars | securePass123 |
| Price | Positive number | 29.99 |
| Coordinates | Number (lat/lng) | 34.0522, -118.2437 |
| URL | Valid URL format | https://example.com |
| Role | Enum of valid roles | seller, admin |
License
MIT
