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