Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 8 years ago.
Improve this questionIs there a good validation framework for node.js that validates a variable for:
- if its a type of String, Date, Number etc
- max and min length
- email, phone
- etc...
I recently discovered node-validator by chriso.
Example
var check = require('validator').check,
sanitize = require('validator').sanitize
//Validate
check('test@email.com').len(6, 64).isEmail(); //Methods are chainable
check('abc').isInt(); //Throws 'Invalid integer'
check('abc', 'Please enter a number').isInt(); //Throws 'Please enter a number'
check('abcdefghijklmnopzrtsuvqxyz').is(/^[a-z]+$/);
//Sanitize / Filter
var int = sanitize('0123').toInt(); //123
var bool = sanitize('true').toBoolean(); //true
var str = sanitize(' \s\t\r hello \n').trim(); //'hello'
var str = sanitize('aaaaaaaaab').ltrim('a'); //'b'
var str = sanitize(large_input_str).xss();
var str = sanitize('<a>').entityDecode(); //'<a>'
I wanted ruby on rails and cakephp style validations. I knew it was something I would use over and over so I made this quick npm module: https://npmjs.org/package/iz
It reads semantically like well like jasmine, and can be used client or server side. This means it comes with support for commonjs and amd along with validation rules passed in via JSON.
It is pretty well unit tested, it has no production dependencies, and the scope is locked down to just validation. We seem to have a small community going now. Ideas, feedback and pull requests are all welcome.
Current library functions:
iz.alphaNumeric(*); // Is number or string(contains only numbers or strings)
iz.between(number, start, end); // Number is start or greater but less than or equal to end, all params numeric
iz.blank(*); // Empty string, undefined or null
iz.boolean(*); // true, false, 0, 1
iz.cc(*); // Luhn checksum approved value
iz.date(*); // Is a data obj or is a string that is easily converted to a date
iz.decimal(*); // Contains 1 decimal point and potentially can have a - at the beginning
iz.email(*); // Seems like a valid email address
iz.extension(ob1, ob2); // If obj2's methods are all found in obj1
iz.fileExtension(arr, value); // Checks if the extension of value is in arr. An obj can be provide, but must have indexOf defined.
iz.fileExtensionAudio(value); // Check against mp3, ogg, wav, aac
iz.fileExtensionImage(value); // Check against png, jpg, jpeg, gif, bmp, svg, gif
iz.inArray(arr, value); // If * is in the array
iz.int(*, bool (optional)); // Is an int. If the 2nd variable is true (false by default) a decimal is allowed
iz.ip(str); // str resembles an IPV4 or IPV6 address
iz.minLen(val, min); // val (str or arr) is greater than min
iz.maxLen(val, max); // val (str or arr) is shorter than max
iz.multiple(num, mult); // Number is multiple of another number
iz.number(*); // Is either an int or decimal
iz.ofType(obj, typeName); // If it is a named object, and the name matches the string
iz.phone(str, canHaveExtension?); // Is an american phone number. Any punctuations are allowed.
iz.postal(*); // Is a postal code or zip code
iz.ssn(*); // Is a social security number
Node-validator is a library of string validation, filtering and sanitization methods.
So if you want to have better support for Numbers and Arrays, you may try Chai.js. Here's some examples:
var expect = require('chai').expect;
try {
expect([1, 2, 3]).to.have.length.below(4);
expect(5).to.be.within(3,6);
expect('test').to.have.length(4);
} catch (e) {
// should not occur
}
I gather that this is the sort of thing that the schema module is meant to do. Note that it is labeled as being "in development" (tagged as v0.1a). I haven't tried it myself, but it looks pretty good from the examples shown in the README.
Not on a variable level, but on a function argument level:
http://github.com/torvalamo/argtype.js
Date currently needs to pass as type 'object'. It is definately something that I have forgotten, and will put on the todo-list. ;)
Specific max and min length is not supported, and will probably not be implemented (but who knows). Email, phone and all that can be checked by regex. See the example on the github page, which includes a (simple) regex example.
I recommend valida there is lack of documentation however it is pretty simple to understand looking at the examples.
Valida features are:
- Sanitization
- Synchronous and asynchronous validation
- Groups
- Extensible
I'm finishing writing a library on Javascript validations (both node and browser), I'll be writing the docs on the next few days, but the code is almost ready: https://github.com/wilkerlucio/composed-validations
Please let me know if you have any questions/suggestions on it :)
精彩评论