用户数据验证灰常重要, 不用多说了, 可是实现方法(准确的说是表现形式)有不少人, 如何优雅的完成一个后端验证过滤器是一个值得考量的问题, 我尝试过许多方法, 好比validator.js模块, express-validator, 还有自定义验证器:html
function lengthRange(min, max) { // 会自动装箱 if (!(this instanceof String)) throw 'string only' if (this.length < min) throw `ERROR BUT LENGTH OF ${this} LESS THAN ${min}` if (this.length > max) throw `ERROR BUT LENGTH OF ${this} MORE THAN ${max}` return true } function matchedChars(list) { if (!(this instanceof String)) throw 'string only' this.split('').forEach(char => { if (!list.includes(char)) throw `${this}: OOPS SORRY ${char} FORBIDDEN` }); return true } function matchedRegexp(reg) { if (!(this instanceof String)) throw 'string only' if (!this.match(reg)) throw `${this}: CONTAINS ILLEGAL CHARS VIOLATING REGULAR EXPRESSION ${reg}` return true } function numberRange(min = -Infinity, max = Infinity) { if (!(this instanceof Number)) throw 'ILLEGAL NUMBER' if (this < min) throw `ERROR BUT ${this} SMALLER THAN ${min}` if (this > max) throw `ERROR BUT ${this} GREATER THAN ${max}` return } module.exports = { lengthRange, matchedChars, matchedRegexp, numberRange }
可是这些办法都很蠢, 由于不管是浏览器仍是nodejs都原生提供"断言"机制, 专门用来处理用户数据, assert模块是Node的内置模块,主要用于断言。若是表达式不符合预期,就抛出一个错误,可用于测试模块功能,有少数几个是经常使用的。node
它的功能其实很简单, 若是断言为false,则将错误消息写入控制台。若是断言为真,则没有任何反应。git
注意: 此功能在Web Workers中可用。github
该 console.assert()
方法在较旧的Node.js版本中的实现console.assert()
方式与浏览器中提供的方法不一样 。在浏览器中,console.assert()
使用falsy断言进行调用会 打印 message
到控制台,而不会中断后续代码的执行。可是,在Node.js v10.0.0以前,一个错误的断言也会致使 AssertionError
抛出。这种差别是经过Node v10修复的,所以console.assert()
如今Node和浏览器中的行为相同。express
console.assert(assertion, obj1 [, obj2, ..., objN]); console.assert(assertion, msg [, subst1, ..., substN]); // c-like message formatting
参数:后端
1. assertion
设计模式
任何布尔表达式。若是断言为false,则将消息写入控制台。api
2. obj1
... objN
数组
要输出的JavaScript对象列表。每一个对象的字符串表示以列出和输出的顺序附加在一块儿。浏览器
3. msg
包含零个或多个替换字符串的JavaScript字符串。
4. subst1
... substN
用于替换替换字符串的JavaScript对象msg
。此参数使您能够进一步控制输出的格式。请注意,虽然包含替换字符串的字符串用做console.log
Node中的参数,但许多(若是不是大多数)浏览器...
...使用此类字符串目前没法console.assert
在全部浏览器中做为参数使用:
我在作后端权限控制的时候也手写过断言工具:
// this: peo (people or user) // white list function allow(list) { if (list.includes(this.level)) return else throw `permission denied: ${this.level}` } // black list function deny(list) { if (!list.includes(this.level)) return else throw `permission denied: ${this.level}` } module.exports = { allow, deny }
固然,asset现在取代了它,由于Assert容许您测试代码
断言 -动词 - 自信而有力地陈述事实或信仰。
在编写代码时,咱们编写测试以自动为咱们检查咱们的代码正在期待它。
断言是编写测试的最基本方式。除非有人失败,不然在运行测试时不提供任何反馈。
assert模块有11个方法,但你只会(按期)使用它们中的一些:assert.equal,assert.deepEqual 和assert.throws。每一个都用下面的例子解释。
第一种方法(按字母顺序排列),但对实际用途最不实用(除非您但愿方法/测试始终失败)。
引起异常,显示由提供的运算符分隔的实际值和预期值。
实用性:几乎没有。我尚未找到实际用途。 http://nodejs.org/api/assert.html#assert_assert_fail_actual_expected_message_operator
测试值是否“真实”,它至关于:
assert.equal(true, value, message);
最简单的断言。
例:
var assert = require('assert'); function add (a, b) { return a + b; } var expected = add(1,2); assert( expected === 3, 'one plus two is three');
这没有任何输出。若是要查看输出,则须要使测试失败:
var assert = require('assert'); function add (a, b) { return a + b; } var expected = add(1,2); assert( expected === 4, 'one plus two is three');
输出:
assert.js:92 throw new assert.AssertionError({ ^ AssertionError: one plus two is NOT four at Object.<anonymous> (/Users/n/code/node-js-by-example/core/assert/assert.js:8:1) at Module._compile (module.js:456:26)
assert.ok(value, [message])
与...基本相同 assert(value, message);
var assert = require('assert'); function add (a, b) { return a + b; } var expected = add(1,2); assert.ok( expected === 3, 'one plus two is three');
一样,因为测试经过,没有输出。要查看一些反馈,请使测试失败。
实用性:广泛性。 assert可用于测试任何代码。
使用(双)相等比较运算符(==)测试浅,强制相等。
为何要使用assert.equal()而不是assert()?
若是你想让你的测试更清楚,那么使用assert.equal,不然对额外的详细程度没有任何好处。
使用不等于比较运算符(!=)测试浅,强制不相等。
思考: 为何要使用assert.notEqual(1,2)而不是assert(1!= 2)?
一样,测试中的冗长/清晰度。
测试深度平等。
assert.deepEqual是第二个有用的方法。咱们用它来比较两个对象(或数组是否相等)。
测试任何深入的不平等。确认两个对象或数组不相等时颇有用。
测试严格相等,由严格相等运算符(===)肯定
相似于assert.equal可是“strict”(类型coersion)。
测试严格不相等,由严格不等于operator(!==
)肯定
与strictEqual相反。
期待阻止抛出错误。错误能够是构造函数,RegExp或验证函数。
该assert.throws让您检查特定于你的函数的错误。
使用构造函数验证instanceof:
期待block
不抛出错误,请参阅assert.throws
详细信息。
不是特别有用的方法由于它太模糊了。很高兴知道你的方法在正常状况下不会抛出错误。
测试值是否为假值,若是值为真值则抛出。在测试第一个参数时有用,回调中的错误。
与全部代码同样,您不能指望在不尝试的状况下学习。在编辑器中打开assert.js文件并尝试一些示例。请记住,除非测试失败,不然您将看不到任何输出。使用如下命令运行它:
node assert.js
其实assert自己是可替代的,没啥技术含量, 也不是必要的, 它只是提供了一种思想, 一种设计模式来高效的完成逻辑控制, 从这一点上看, assert实际上是很可爱的.
在“现实世界”中,人们不多经过其“自我”使用节点断言模块。而是使用测试运行器。
Node.js测试运行器的示例包括: