Skip to content

Dallas62/express-contract

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

express-contract Build Status

express-contract is a small project that add contract validation to your API.

Installation

yarn add express-contract
npm install --save express-contract

Usage

const Joi = require("joi"); // Or any schema validator (must have a .validate() method)
const contract = require("express-contract").contract;

const schema = Joi.object().keys({
  username: Joi.string().alphanum().min(3).max(30).required(),
});

app.post("/api/user", contract(schema), function (req, res) {
  if (!req.compliance) {
    // Look at req.violation for validation errors

    res.status(400).json({
      error: "Bad request",
    });

    return;
  }

  res.status(200).json(req.body);
});

Variables:

  • req.compliance to know if the contract is respected
  • req.body to access the object return by validator
  • req.originalBody to access original object return by validator
  • req.query to access the object return by validator (GET only)
  • req.originalQuery to access original object return by validator (GET only)
  • req.violation for validation error

You can also precise the property to validate (usually body or query, but can be whatever you want), by default it's body, expect for GET requests.

// like /api/user?username=tot even if it's a POST method
app.post("/api/user", contract(schema, "query"), function (req, res) {
  if (!req.compliance) {
    // Look at req.violation for validation errors

    res.status(400).json({
      error: "Bad request",
    });

    return;
  }

  res.status(200).json(req.query);
});

Or using multiple contract, but while not validate others contracts the previous failed.

app.post(
  "/api/user",
  contract(schema_query, "query"),
  contract(schema_body, "body"),
  function (req, res) {
    if (!req.compliance) {
      // Look at req.violation for validation errors

      res.status(400).json({
        error: "Bad request",
      });

      return;
    }

    res.status(200).json({
      query: req.query,
      body: req.body,
    });
  }
);

Actually, it was test with Joi, and need body-parser.

But should work with other validators if the .validate() method has the following signature:

Schema.validate(schema, callback(err, value));

value returned by the validator's callback is used to get defaults values that are set in the schema.

Keep in touch!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published