用戶數據驗證的正確姿式之assert

用戶數據驗證灰常重要, 不用多說了, 可是實現方法(準確的說是表現形式)有不少人, 如何優雅的完成一個後端驗證過濾器是一個值得考量的問題, 我嘗試過許多方法, 好比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

console.assert

它的功能其實很簡單, 若是斷言爲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在全部瀏覽器中做爲參數使用:

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測試運行器的示例包括:

相關文章
相關標籤/搜索