@strata-js/middleware-payload-validation v2.1.0
Strata Payload Validation Middleware
Payload validation middleware for use with a Strata Service. See the Strata Middleware documentation for more details.
Strata Payload Validation Middleware uses AJV or Zod internally to validate payloads that are passed to the Strata Service.
The following AJV Plugins are included in the middleware:
Installation
This middleware package is published via NPM's npm repository.
// npm
$ npm add @strata-js/middleware-payload-validation
// yarn
$ yarn add @strata-js/middleware-payload-validation
Usage
Setting up payload validation with AJV
A validation configuration must be provided that is an object with the operation name(s) as the property names and a valid JSON Schema as the value. An optional custom error message formatter may be provided that will format the error message according to the supplied function.
import { Context } from '@strata-js/strata';
import { AjvPayloadValidationMiddleware } from '@strata-js/middleware-payload-validation/ajv';
import { DefinedError } from 'ajv';
const context = new Context();
// using the default error formatter
const validationConfig = {
doSomething: {
type: 'object',
required: ['foo', 'bar'],
properties: {
foo: { type: 'string', minLength: 2, maxLength: 2, pattern: '^\\d{2}$' },
bar: { type: 'integer', minimum: 1, maximum: 1000 },
baz: { enum: [[2, "foo", { foo: 'bar' }, [1, 2, 3]]] }
}
}
}
const payloadValidationMiddleware = new AjvPayloadValidationMiddleware(validationConfig);
context.operation('doSomething', async (request): Promise<any> => {
return this._doSomething(request.payload);
}, [payloadValidationMiddleware]);
// using the optional error formatter
const otherValidationConfig = {
doSomethingElse: {
type: 'object',
required: ['foo'],
properties: {
foo: { type: 'string', minLength: 1 }
}
}
}
const payloadValidationMiddlewareScrubbed = new AjvPayloadValidationMiddleware(
otherValidationConfig,
undefined,
(errors: DefinedError[]) => {
return 'Invalid Request: request is not in the correct format';
}
);
context.operation('doSomethingElse', async (request): Promise<any> => {
return this._doSomethingElse(request.payload);
}, [payloadValidationMiddlewareScrubbed]);
Setting up payload validation with Zod
A validation configuration must be provided that is an object with the operation name(s) as the property names and a valid Zod Schema as the value.
import { Context } from '@strata-js/strata';
import { ZodPayloadValidationMiddleware } from '@strata-js/middleware-payload-validation/zod';
import { z } from 'zod';
const context = new Context();
// using Zod for validation
const validationConfig = {
doSomething: z.object({
foo: z.string().min(2).max(2).regex(/^\d{2}$/),
bar: z.number().min(1).max(1000),
baz: z.enum([2, "foo", { foo: 'bar' }, [1, 2, 3]])
})
}
const payloadValidationMiddleware = new ZodPayloadValidationMiddleware(validationConfig);
context.operation('doSomething', async (request): Promise<any> => {
return this._doSomething(request.payload);
}, [payloadValidationMiddleware]);
Future Improvements
- Support JSON Type Definition
- Support User Defined Keywords
- Make AJV Plugins used configurable