dat-middleware

common request, response, body, query, and param validation, transformation, and flow control middleware

dat-middleware

Common request, response, body, query, and param validation, transformation, and flow control middleware

Installation

npm install dat-middleware

Examples

Validations:

requires the keys specified, and nexts a 400 error if one does not exist

mw.body(keys..).require()
mw.query(keys..).require()
mw.params(keys..).require()
var mw = require('dat-middleware');
var app = require('express')();
 
// requires that req.body.key1 and req.body.key2 are not undefined 
app.use(mw.body('key1, key2').require());
// example error: 
// 400 { message: body parameter "key1" is required } 

requires the keys are strings (if they exist), and nexts a 400 error if one is not

mw.body(keys..).string()
mw.query(keys..).string()
mw.params(keys..).string()

requires the keys are numbers (if they exist), and nexts a 400 error if one is not

mw.body(keys..).number()
mw.query(keys..).number()
mw.params(keys..).number()

requires the keys are objects (if they exist), and nexts a 400 error if one is not

mw.body(keys..).object()
mw.query(keys..).object()
mw.params(keys..).object()

requires the keys are functions (if they exist), and nexts a 400 error if one is not

mw.body(keys..).function()
mw.query(keys..).function()
mw.params(keys..).function()

requires the keys are booleans (if they exist), and nexts a 400 error if one is not

mw.body(keys..).boolean()
mw.query(keys..).boolean()
mw.params(keys..).boolean()

requires the keys are arrays (if they exist), and nexts a 400 error if one is not

mw.body(keys..).array()
mw.query(keys..).array()
mw.params(keys..).array()
var mw = require('dat-middleware');
var app = require('express')();
 
// requires that req.body.key1 and req.body.key2 arrays *if they exist* 
app.use(mw.body('key1, key2').array());
// example error: 
// 400 { message: body parameter "key1" must be an array } 
mw.body(keys..).instanceOf(Class)
mw.query(keys..).instanceOf(Class)
mw.params(keys..).instanceOf(Class)

requires the keys are an instance of the specified class (if they exist), and nexts a 400 error if one is not

var mw = require('dat-middleware');
var app = require('express')();
 
// requires that req.body.key1 and req.body.key2 arrays *if they exist* 
app.use(mw.body('key1, key2').instanceOf(Class));
// example error: 
// 400 { message: body parameter "key1" must be an instance of Class } 

requires the keys are an instance of the specified class (if they exist), and nexts a 400 error if one is not

var mw = require('dat-middleware');
var app = require('express')();
 
// requires that req.body.key1 and req.body.key2 match the regexp *if they exist* 
app.use(mw.body('key1, key2').matches(/^hello/));
// example error: 
// 400 { message: body parameter "key1" must match /^hello/ } 

requires the keys pass the validation (if they exist), and nexts a 400 error if one is not dat-middleware uses spumko/boom for http errors (exported as mw.Boom)

var mw = require('dat-middleware');
var app = require('express')();
function is24Chars (val) {
  return (val.length !== 24) ?
    mw.Boom.badRequest('is not 24 characters'):
    null; // pass 
}
 
// requires that req.body.key1 and req.body.key2 arrays *if they exist* 
app.use(mw.body('key1, key2').validate(is24Chars));
// example error: 
// 400 { message: body parameter "key1" is not 24 characters } 

Transformations:

transforms the values of the keys specified using the transformation function

var mw = require('dat-middleware');
var app = require('express')();
function toInt (v) {
  return parseInt(v);
}
 
// transforms the req.body.key1 and req.body.key2 to integers 
app.use(mw.body('key1, key2').mapValues(toInt));

transforms the entire dataType object using the transformation function

var mw = require('dat-middleware');
var app = require('express')();
function valuesToInt (body) {
  Object.keys(body).forEach(function (key) {
    body[key] = parseInt(body[key]);
  });
}
 
// transforms the req.body.key1 and req.body.key2 to integers 
app.use(mw.body().transform(valuesToInt));

picks the keys specified and ignores the rest. a way of filtering data values by key.

var mw = require('dat-middleware');
var app = require('express')();
 
// a body of { key1: true, key2: true, key3:true } becomes { key1: true } 
app.use(mw.body('key1').pick());

sets the keys and values on the data type.

var mw = require('dat-middleware');
var app = require('express')();
 
// a body of { foo: 1 } becomes { foo: 1, key: 'value' } 
app.use(mw.body().set('key', 'value'));
 
// a body of { key1: true, key2: true, key3:true } becomes extended by obj 
app.use(mw.body().set(obj));
 
// a body of { key1: 2 } becomes { key1: 2, key2: 1.4142135623730951 } 
app.use(mw.body().set('key2', 'key1', function (val) { return Math.sqrt(val); }))

deletes the keys on the data type.

var mw = require('dat-middleware');
var app = require('express')();
 
// a body of { key1: true, key2: true, key3:true } becomes { key3:true } 
app.use(mw.body().unset('key1', 'key2'));

Flow Control

iterates through a series of middlewares (in parallel) for each item in an array

var mw = require('dat-middleware');
var app = require('express')();
 
// a body of { arr: [1,2,3] } 
app.use(mw.body('arr').each(
  function (eachReqresnext) {
    // eachReq prototypically inherits from the original req 
    // (get gets from req, set only sets to eachReq) 
  },
  function (itemreqeachReqresnext) {
    // if five arguments are accepted the current item and the origin req are passed 
  }
));

Conditionals (flow control):

for more flow control checkout middleware-flow

var mw = require('dat-middleware');
var app = require('express')();
 
// requires that req.body.key1 and req.body.key2 exist and are 24 characters 
app.use(mw.body('key1, key2').require()
  .then(mw1) // executes mw1 if key1 and key2 exist 
  .else(mw2) // executes mw1 if key1 and key2 if they dont 
             // if mw2 accept an error it will recieve the validation error, else it will be ignored 
);

Chaining: chained methods will run in order

note: conditionals do not chain before validations and transformations

var mw = require('dat-middleware');
var app = require('express')();
function hasLengthOf3 (val) {
  return (val.length !== 3) ?
    mw.Boom.badRequest('is not 3 characters'):
    null; // pass 
}
function toInt (v) {
  return parseInt(v);
}
 
// requires that req.body.key1 and req.body.key2 exist and are 24 characters 
app.use(mw.body('key1, key2').require().validate(hasLengthOf3).transform(toInt));

License