express-schema-server
v3.8.2
Published
Middleware for describing and validating your REST API routes using JSON schemas.
Downloads
52
Maintainers
Readme
Express.js JSON schema server middleware
Middleware for describing and validating your REST API routes using JSON schemas.
- Automatic validation of both inputs and outputs using JSON schema.
- Self-descriptive, includes automatic endpoints for all route descriptors.
- Includes extensive example showing how to organize your code, perform authentication and use databases.
- The route descriptors can be used to generate automatic documentation, testing user interface, TypeScript definitions etc.
- Written in TypeScript.
- Minimum boilerplate.
- Every endpoint handler is in a separate file.
- Easy to test with supertest.
Installation
This package is distributed via npm
npm install express-schema-server
Commands
npm run build
to build the production version.npm run test
to run tests.npm run lint
to lint the codebase.npm run start
to start the example application.npm run debug
to start the example application in debug mode (--inspect
).npm run coverage
to gather code coverage.npm run prettier
to run prettier.
Example
See src/example
directory for a full working example code and run npm start
to try it out for yourself.
Following is an example route for creating a new user.
import { normalizeType } from "normalize-type";
import { buildResponseSchema, ICustomValidator, IRouteDefinition, JSONSchema4, validateJsonSchema } from "../../../";
import { IServerContext } from "../../app";
import validateUniqueEmail from "../../validators/validateUniqueEmail";
import { IUser, transformUser, userSchema } from "./users";
export interface CreateUserRequest {
name: string;
email: string;
}
export const requestSchema: JSONSchema4 = {
title: "Create user",
description: "Create a new user account",
type: "object",
properties: {
name: {
type: "string",
title: "Name",
description: "User name",
minLength: 3,
maxLength: 100,
},
email: {
type: "string",
title: "Email",
description: "Email address",
minLength: 3,
maxLength: 256,
allOf: [
{
format: "email",
},
{
format: "unique-email",
},
],
},
},
required: ["name", "email"],
};
export const responseSchema: JSONSchema4 = buildResponseSchema(userSchema);
export default (): IRouteDefinition<IServerContext> => ({
path: "",
method: "post",
metadata: {
title: "Register user",
description: "Register a new user account",
sinceVersion: "1.0.0",
isDeprecated: false,
},
requestSchema,
responseSchema,
handler: async (request, response, _next) => {
const requestData = normalizeType<CreateUserRequest>(request.body);
const validators: ICustomValidator[] = [validateUniqueEmail(request.db.user)];
const validationResult = await validateJsonSchema(requestData, requestSchema, validators);
if (!validationResult.isValid) {
response.fail(validationResult.errors, responseSchema, validators);
return;
}
const user = await request.db.user.save(requestData);
response.success<IUser>(transformUser(user), responseSchema, validators);
},
});