• 用户数据验证的正确姿势之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.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测试运行器的示例包括:

  • 相关阅读:
    PHP 数据库 ODBC
    PHP MySQL Delete
    PHP MySQL Update
    PHP MySQL Order By 关键词
    PHP MySQL Where 子句
    01_今日介绍
    00_前情回顾
    02_cfork分叉进程
    01_c++下jni开发说明
    17_activity任务栈和启动模式
  • 原文地址:https://www.cnblogs.com/xosg/p/10257758.html
Copyright © 2020-2023  润新知