exy-router is a modified version of the popular Express.js router with enhanced functionality for request and response validation using Ajv.js. It automatically generates OpenAPI documentation based on JSON schemas, simplifying API documentation tasks.
- Request Validation: Validate request bodies, parameters, and query strings against JSON schemas using Ajv.js.
- Response Validation: Validate response JSON data against a JSON schema.
- OpenAPI Documentation: Automatically generate OpenAPI documentation based on your route configurations and JSON schemas.
- Express.js Compatibility: exy-router maintains compatibility with Express.js, making it easy to integrate into existing Express applications.
- Middleware Support: Use middleware functions with exy-router for authentication, logging, and more.
- Easy to Use: Define routes and schema validations with a simple and intuitive syntax.
Install exy-router using npm:
npm install exy-router --save
Here's a quick example of how to set up a route with request and response validation and OpenAPI documentation:
const express = require("express");
const cors = require("cors");
const createRouter = require("exy-router");
const app = express();
const router = createRouter(express.Router)();
app.use(express.json());
app.use(cors());
// Setup OpenAPI
router.setupDocs("/api-docs", {
openapi: "3.1.0",
info: {
title: "exy-router",
version: "1.0.0",
},
servers: [
{
url: "http://127.0.0.1:3000/api",
description: "Production server (uses live data)",
},
],
});
// Define a schema for request validation
const requestSchema = {
type: "object",
properties: {
username: { type: "string", minLength: 3 },
password: { type: "string", minLength: 8 },
},
required: ["username", "password"],
};
// Define a schema for response validation
const responseSchema = {
type: "object",
description: "Logged in successfully",
properties: {
message: { type: "string" },
},
required: ["message"],
};
// Create a route with request and response validation
router.post(
"/login",
{
schema: {
body: requestSchema,
response: {
200: responseSchema,
},
},
},
(req, res) => {
// Your route logic here
res.json({ message: "Logged in successfully" });
}
);
// Create a route with params validation
router.get(
"/product/:id",
{
schema: {
params: {
type: "object",
properties: {
id: { type: "string" },
},
required: ["id"],
},
response: {
200: {
description: "This API will return your product id",
},
},
},
},
(req, res) => {
// Your route logic here
res.json({ message: `Your product id is ${req.params.id}` });
}
);
// Create a route with query string validation
router.get(
"/order",
{
schema: {
query: {
type: "object",
properties: {
id: { type: "string" },
page: { type: "string" },
},
required: ["id"],
},
},
},
(req, res) => {
// Your route logic here
res.json({ message: `Your order id is ${req.query.id}` });
}
);
app.use("/api", router);
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
For JSON Schema documentation and examples, please visit json-schema.org
We welcome contributions from the community! If you'd like to contribute to exy-router, please email us.
This project is licensed under the MIT License - see the LICENSE file for details.
This package is inspired by Fastify.js. Special thanks to the open-source community for their contributions and support.