@ansuz-dev/request-validator

Json schema validator for Express request


Keywords
json, schema, express, request, validation, validitor
License
MIT
Install
npm install @ansuz-dev/request-validator@0.0.1

Documentation

Json Schema Validator for Express Request

A validator using ajv to validate input in Express request.

npm npm downloads Dependency Status

Installation

Using npm:

npm install --save @ansuz-dev/request-validator

Usage

Initialization

const { validator } = require("@ansuz-dev/request-validator");

validator.init({
  // point to directory containing schemas
  // schemas are loaded recursively in sub-directory
  schemas: path.join(__dirname, "schemas")
});

The json schema in schemas directory should be formated as:

{
  "$id": "/api/post/param",
  "type": "object",
  "properties": {
    "body": {
      "type": "object",
      "properties": {
        "userId": {
          "$ref": "/core#/definitions/uint"
        },
        "postId": {
          "$ref": "/core#/definitions/uint"
        }
      },
      "additionProperties": false,
      "required": [ "userId", "postId" ]
    },
    "params": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "/core#/definitions/uint"
        }
      },
      "additionProperties": false,
      "required": [ "id" ]
    }
  },
  "required": [ "body", "params" ]
}

Depends on the require, you could have body, params or query property.

Use as middleware

Once initialization, the validator could be used as middleware in your route:

const { validator } = require("@ansuz-dev/request-validator");
const router = express.Router();

router.get("/param/:id", [
  validator.validator("/api/get/param"),
  // TODO: your real handler here
]);

router.post("/param/:id", [
  validator.validator("/api/post/param"),
  // TODO: your real handler here
]);

It also works with async-router:

const { Router } = require("@ansuz-dev/async-router");
const { validator } = require("@ansuz-dev/request-validator");

const router = new Router();

router.get("/query", [
  validator.validatorAsync("/api/get/query"),
  async (req, res) => {
    // TODO: your code here
  }
]);

Convert query and param value

Add a simple convertor before validating your request:

const { validator, convertor } = require("@ansuz-dev/request-validator");
const router = express.Router();

router.get("/param/:id", [
  convertor.param([
    ["id", "number"]
  ]),
  validator.validator("/api/get/param"),
  // TODO: your real handler here
]);

router.post("/param/:id", [
  convertor.param([
    ["id", "number"]
  ]),
  validator.validator("/api/post/param"),
  // TODO: your real handler here
]);

and for asynchronous version:

const { Router } = require("@ansuz-dev/async-router");
const { validator, convertor } = require("@ansuz-dev/request-validator");

const router = new Router();

router.get("/query", [
  convertor.queryAsync([
    ["ids", "array"]
  ]),
  validator.validatorAsync("/api/get/query"),
  async (req, res) => {
    // TODO: your code here
  }
]);

API

  • validator
    validator.init({
      schemas: "<defined schemas directory>"
    })

    validator.validate(schemaId, data) : return boolean value

    validator.validator(schemaId) : return a middle function

    validator.validatorAsync(schemaId) : return an async middle function
  • convertor
    // convert value in query object
    // `type` could be `number`, `array`, or `object`
    convertor.query([
      [ "<name>", "<type>" ],
      ...
    ]) : return a middle function

    convert.queryAsync([
      [ "<name>", "<type>" ],
      ...
    ]) : return an async middle function

    // convert value in param object
    // `type` could be `number`, `array`, or `object`
    convertor.param([
      [ "<name>", "<type>" ],
      ...
    ]) : return a middle function

    convert.paramAsync([
      [ "<name>", "<type>" ],
      ...
    ]) : return an async middle function

Example

Check on Github.

License

MIT