用户数据验证的正确姿势之assert
用户数据验证灰常重要, 不用多说了, 但是实现方法(准确的说是表现形式)有很多人, 如何优雅的完成一个后端验证过滤器是一个值得考量的问题, 我尝试过许多方法, 比如validator.js模块, express-validator, 还有自定义验证器:
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的内置模块,主要用于断言。如果表达式不符合预期,就抛出一个错误,可用于测试模块功能,有少数几个是常用的。
console.assert
它的功能其实很简单, 如果断言为false,则将错误消息写入控制台。如果断言为真,则没有任何反应。
注意: 此功能在Web Workers中可用。
该 console.assert() 方法在较旧的Node.js版本中的实现console.assert() 方式与浏览器中提供的方法不同 。在浏览器中,console.assert() 使用falsy断言进行调用会 打印 message 到控制台,而不会中断后续代码的执行。但是,在Node.js v10.0.0之前,一个错误的断言也会导致 AssertionError 抛出。这种差异是通过Node v10修复的,因此console.assert() 现在Node和浏览器中的行为相同。
语法
console.assert(assertion, obj1 [, obj2, ..., objN]);
console.assert(assertion, msg [, subst1, ..., substN]); // c-like message formatting
参数
参数:
1. assertion
任何布尔表达式。如果断言为false,则将消息写入控制台。
2. obj1 ... objN
要输出的JavaScript对象列表。每个对象的字符串表示以列出和输出的顺序附加在一起。
3. msg
包含零个或多个替换字符串的JavaScript字符串。
4. subst1 ... substN
用于替换替换字符串的JavaScript对象msg。此参数使您可以进一步控制输出的格式。请注意,虽然包含替换字符串的字符串用作console.log Node中的参数,但许多(如果不是大多数)浏览器...
...使用此类字符串目前无法console.assert在所有浏览器中作为参数使用:
nodejs中的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允许您测试代码
先决条件
- 已安装Node.js.
- 没有先验知识
技能等级
- 基本/初级
assert in node
断言 -动词 - 自信而有力地陈述事实或信仰。
在编写代码时,我们编写测试以自动为我们检查我们的代码正在期待它。
断言是编写测试的最基本方式。除非有人失败,否则在运行测试时不提供任何反馈。
assert模块有11个方法,但你只会(定期)使用它们中的一些:assert.equal,assert.deepEqual 和assert.throws。每个都用下面的例子解释。
assert.fail(实际,预期,消息,运算符)
第一种方法(按字母顺序排列),但对实际用途最不实用(除非您希望方法/测试始终失败)。
引发异常,显示由提供的运算符分隔的实际值和预期值。
实用性:几乎没有。我还没有找到实际用途。 http://nodejs.org/api/assert.html#assert_assert_fail_actual_expected_message_operator
assert(value,message),assert.ok(value,[message])
测试值是否“真实”,它相当于:
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(actual,expected,[message])
使用(双)相等比较运算符(==)测试浅,强制相等。
为什么要使用assert.equal()而不是assert()?
如果你想让你的测试更清楚,那么使用assert.equal,否则对额外的详细程度没有任何好处。
assert.notEqual(actual,expected,[message])
使用不等于比较运算符(!=)测试浅,强制不相等。
思考: 为什么要使用assert.notEqual(1,2)而不是assert(1!= 2)?
同样,测试中的冗长/清晰度。
assert.deepEqual(actual,expected,[message])
测试深度平等。
assert.deepEqual是第二个有用的方法。我们用它来比较两个对象(或数组是否相等)。
assert.notDeepEqual(actual,expected,[message])
测试任何深刻的不平等。确认两个对象或数组不相等时很有用。
assert.strictEqual(actual,expected,[message])
测试严格相等,由严格相等运算符(===)确定
类似于assert.equal但是“strict”(类型coersion)。
assert.notStrictEqual(actual,expected,[message])
测试严格不相等,由严格不等于operator(!==)确定
与strictEqual相反。
assert.throws(块,[错误],[消息])
期待阻止抛出错误。错误可以是构造函数,RegExp或验证函数。
该assert.throws让您检查特定于你的函数的错误。
使用构造函数验证instanceof:
assert.doesNotThrow(块,[消息])
期待block不抛出错误,请参阅assert.throws详细信息。
不是特别有用的方法因为它太模糊了。很高兴知道你的方法在正常情况下不会抛出错误。
assert.ifError(值)
测试值是否为假值,如果值为真值则抛出。在测试第一个参数时有用,回调中的错误。
试试吧!
与所有代码一样,您不能期望在不尝试的情况下学习。在编辑器中打开assert.js文件并尝试一些示例。请记住,除非测试失败,否则您将看不到任何输出。使用以下命令运行它:
node assert.js
其实assert本身是可替代的,没啥技术含量, 也不是必要的, 它只是提供了一种思想, 一种设计模式来高效的完成逻辑控制, 从这一点上看, assert其实是很可爱的.
参考
- 断言API:http://nodejs.org/api/assert.html
- Chris Johansen的节点测试介绍:http: //cjohansen.no/en/node_js/unit_testing_node_js_apps
在线测试
在“现实世界”中,人们很少通过其“自我”使用节点断言模块。而是使用测试运行器。
Node.js测试运行器的示例包括:
- 摩卡:https://github.com/visionmedia/mocha
- 磁带:https://github.com/substack/tape
- 实验室:https://github.com/hapijs/lab
用户数据验证的正确姿势之assert的更多相关文章
- 04: Form 验证用户数据 & 生成html
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- Ruby Rails学习中:User 模型,验证用户数据
用户建模 一. User 模型 实现用户注册功能的第一步是,创建一个数据结构,用于存取用户的信息. 在 Rails 中,数据模型的默认数据结构叫模型(model,MVC 中的 M).Rails 为解决 ...
- Ubuntu创建新用户的正确姿势
作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<Ubuntu 创建新用户的正确姿势>原文地址.更欢迎来我的小站看更多原创内容:godbmw.com,进行&q ...
- Silverlight实例教程 - Validation用户提交数据验证捕获(转载)
Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...
- 禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。
https://github.com/alibaba/p3c/blob/master/阿里巴巴Java开发手册(详尽版).pdf 5. [强制]禁止向 HTML 页面输出未经安全过滤或未正确转义的用户 ...
- spring(7)--注解式控制器的数据验证、类型转换及格式化
7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...
- 我这么玩Web Api(二):数据验证,全局数据验证与单元测试
目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试 一.模型状态 - ModelState 我理解 ...
- MVC 数据验证
MVC 数据验证 前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填 ...
- avalon2学习教程12数据验证
avalon2砍掉了不少功能(如ms-include,ms-data),腾出空间加了其他更有用的功能.数据验证就是其中之一.现在avalon2内置的验证指令是参考之前的oniui验证框架与jquery ...
随机推荐
- JavaScript 设计模式之单例模式
一.单例模式概念解读 1.单例模式概念文字解读 单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在Ja ...
- Linux 通过cron定期执行 php文件(转)
Linux 通过cron定期执行 php文件 补充几点: 1. 要在php文件头加上解释器的路径,通常是 #!/usr/bin/php 2. 授予要执行的php文件执行权限 chmod a+x x ...
- Javascript-js实现多线程
原文地址:https://www.cnblogs.com/haodawang/articles/5850822.html 在讲之前,大家都知道js是基于单线程的,而这个线程就是浏览器的js引擎.首先来 ...
- R.string获取的是数字或者R.integer数字不对的问题
String msg = R.string.menu_title; 获取menu_title的String值,但发现这样写报错,原因R.string.menu_title是int类型的,可是通过以下方 ...
- JMeter学习笔记---性能分析
图像结果: 通过观察平均采样响应时长,用户可以直观地看到,随着并发压力的加大,以及性能测试时间的延长,系统性能所发生的变化.正常情况下,平均采样响应时长曲线应该是平滑的,并大致平行于图像下边界. 异常 ...
- poj1564 Sum it up
题目链接: http://poj.org/problem?id=1564 题目: Sum It Up Time Limit: 1000MS Memory Limit: 10000K Total S ...
- spring 多线程
http://blog.csdn.net/chszs/article/details/8219189 一.ThreadPoolTaskExecutor ThreadPoolTaskExecutor的配 ...
- eclipse3.7之后,在引入的jquery的js文件打红叉
使用Eclipse 3.7时,工程中加入jquery.xx.js文件,发现该文件出现错误提示(红×),但使用Eclipse 3.7以前的版本就不会出现这种提示.是因为Eclipse 3.7在.proj ...
- python pandas 计算相关系数
pandas 中df 对象自带相关性计算方法corr() , 可以用来计算DataFrame对象中所有列之间的相关系数(包括pearson相关系数.Kendall Tau相关系数和spearman秩相 ...
- php 7.1安装教程
一.下载地址 http://php.net/downloads.php#v7.1.9 IIS如果你使用的是PHP的FastCGI IIS,你应该使用非线程安全(NTS)版本的PHP. Apache请使 ...