用户数据验证灰常重要, 不用多说了, 但是实现方法(准确的说是表现形式)有很多人, 如何优雅的完成一个后端验证过滤器是一个值得考量的问题, 我尝试过许多方法, 比如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.equalassert.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其实是很可爱的.

参考

在线测试

在“现实世界”中,人们很少通过其“自我”使用节点断言模块。而是使用测试运行器。

Node.js测试运行器的示例包括:

用户数据验证的正确姿势之assert的更多相关文章

  1. 04: Form 验证用户数据 & 生成html

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  2. Ruby Rails学习中:User 模型,验证用户数据

    用户建模 一. User 模型 实现用户注册功能的第一步是,创建一个数据结构,用于存取用户的信息. 在 Rails 中,数据模型的默认数据结构叫模型(model,MVC 中的 M).Rails 为解决 ...

  3. Ubuntu创建新用户的正确姿势

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<Ubuntu 创建新用户的正确姿势>原文地址.更欢迎来我的小站看更多原创内容:godbmw.com,进行&q ...

  4. Silverlight实例教程 - Validation用户提交数据验证捕获(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  5. 禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。

    https://github.com/alibaba/p3c/blob/master/阿里巴巴Java开发手册(详尽版).pdf 5. [强制]禁止向 HTML 页面输出未经安全过滤或未正确转义的用户 ...

  6. spring(7)--注解式控制器的数据验证、类型转换及格式化

    7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...

  7. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

  8. MVC 数据验证

    MVC 数据验证 前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填 ...

  9. avalon2学习教程12数据验证

    avalon2砍掉了不少功能(如ms-include,ms-data),腾出空间加了其他更有用的功能.数据验证就是其中之一.现在avalon2内置的验证指令是参考之前的oniui验证框架与jquery ...

随机推荐

  1. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  2. c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

    //求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...

  3. Note for video Machine Learning and Data Mining——training vs Testing

    Here is the note for lecture five. There will be several points  1. Training and Testing  Both of th ...

  4. Oracle 11gR2数据库使用

    1很奇怪,不太懂原理 一.Oracle 12c创建用户是出现“ORA-65096: invalid common user or role name”的错误 - CalvinR http://www. ...

  5. ES6 class setTimeout promise async/await 测试Demo

    class Person { async getVersion () { return new Promise((resolve, reject) => { setTimeout(functio ...

  6. Hg(Mercurial)版本管理学习

    1.关闭分支,首先切到你要关闭的分支 hg commit --close-branch -m. 2.仓库ip地址改变之后,重设仓库ip 找到.hg文件夹 - hgrc文件 - 记事本打开重设 3.推分 ...

  7. C++ 智能指针 shared_ptr

    今天晚上去旁听了C++高级编程的课,其中提到智能指针.第一反映还以为是auto_ptr呢,一听才知道是share_ptr这个.哦,原来是C++11特性.大致的原因是auto_ptr有一点缺陷,而sha ...

  8. iOS之Sqlite3封装

    一.代码下载 代码下载地址 二.实例效果展示 imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="效果图二.png&q ...

  9. Python 訪问Google+ (http)

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-28 @author: guaguastd @name: l ...

  10. Android系统框架介绍

    src目录:主要是完成java代码的编写 assets目录:资源目录 res目录:存在图片,布局文件和字符串.菜单等文件 bin目录:输出文件夹,如生成的APK文件 project,propertie ...