成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Node 如何在 Controller 層進行數據校驗

開發 前端
幽默風趣的后端程序員一般自嘲為 CURD Boy。CURD, 也就是對某一存儲資源的增刪改查,這完全是面向數據編程啊。

幽默風趣的后端程序員一般自嘲為 CURD Boy。CURD, 也就是對某一存儲資源的增刪改查,這完全是面向數據編程啊。

真好呀,面向數據編程,往往會對業務理解地更加透徹,從而寫出更高質量的代碼,造出更少的 BUG。既然是面向數據編程那更需要避免臟數據的出現,加強數據校驗。否則,難道要相信前端的數據校驗嗎,畢竟前端數據校驗直達用戶,是為了 UI 層更友好的用戶反饋。

數據校驗層

后端由于重業務邏輯以及待處理各種數據,以致于分成各種各樣的層級,以我經歷過的后端項目就有分為 Controller、Service、Model、Helper、Entity 等各種命名的層,五花八門。但這里肯定有一個層稱為 Controller,站在后端最上層直接接收客戶端傳輸數據。

由于 Controller 層是服務器端中與客戶端數據交互的最頂層,秉承著 Fail Fast的原則,肩負著數據過濾器的功能,對于不合法數據直接打回去,如同秦瓊與尉遲恭門神般威嚴。

數據校驗同時衍生了一個半文檔化的副產品,你只需要看一眼數據校驗層,便知道要傳哪些字段,都是些什么格式。

以下都是常見的數據校驗,本文講述如何對它們進行校驗:

  • required/optional
  • 基本的數據校驗,如 number、string、timestamp 及值需要滿足的條件
  • 復雜的數據校驗,如 IP、手機號、郵箱與域名
    1. const body = { 
    2.   id, 
    3.   name, 
    4.   mobilePhone, 
    5.   email 

山月接觸過一個沒有數據校驗層的后端項目,if/else 充斥在各種層級,萬分痛苦,分分鐘向重構。

JSON Schema

JSON Schema 基于 JSON 進行數據校驗格式,并附有一份規范 json-schema.org[1],目前 (2020-08) 最新版本是 7.0。各種服務器編程語言都對規范進行了實現,如 go、java、php 等,當然偉大的 javascript 也有,如不溫不火的 ajv[2]。

以下是校驗用戶信息的一個 Schema,可見語法復雜與繁瑣:

  1.   "$schema": "http://json-schema.org/draft-04/schema#", 
  2.   "title": "User", 
  3.   "description": "用戶信息", 
  4.   "type": "object", 
  5.   "properties": { 
  6.     "id": { 
  7.       "description": "用戶 ID", 
  8.       "type": "integer" 
  9.     }, 
  10.     "name": { 
  11.       "description": "用戶姓名", 
  12.       "type": "string" 
  13.     }, 
  14.     "email": { 
  15.       "description": "用戶郵箱", 
  16.       "type": "string", 
  17.       "format": "email", 
  18.       "maxLength": 20 
  19.     }, 
  20.     "mobilePhone": { 
  21.       "description": "用戶手機號", 
  22.       "type": "string", 
  23.       "pattern": "^(?:(?:\+|00)86)?1[3-9]\d{9}$", 
  24.       "maxLength": 15 
  25.     } 
  26.   }, 
  27.   "required": ["id", "name"] 

對于復雜的數據類型校驗,JSON Schema 內置了以下 Format,方便快捷校驗:

  • Dates and times
  • Email addresses
  • Hostnames
  • IP Addresses
  • Resource identifiers
  • URI template
  • JSON Pointer
  • Regular Expressions

對于不在內置 Format 中的手機號,使用 ajv.addFormat 可手動添加 Format:

  1. ajv.addFormat('mobilePhone', (str) => /^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(str)); 

Joijoi

自稱最強大的 JS 校驗庫,在 github 也斬獲了一萬六顆星星。相比 JSON Schema 而言,它的語法更加簡潔并且功能強大。

The most powerful data validation library for JS

完成相同的校驗,僅需要更少的代碼,并能夠完成更加強大的校驗。以下僅做示例,更多示例請前往文檔。

  1. const schema = Joi.object({ 
  2.   id: Joi.number().required(), 
  3.   name: Joi.number().required(), 
  4.   email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } }), 
  5.   mobilePhone: Joi.string().pattern(/^(?:(?:\+|00)86)?1[3-9]\d{9}$/), 
  6.  
  7.   password: Joi.string().pattern(/^[a-zA-Z0-9]{3,30}$/), 
  8.   // 與 password 相同的校驗 
  9.   repeatPassword: Joi.ref('password'), 
  10. }) 
  11.   // 密碼與重復密碼需要同時發送 
  12.   .with('password', 'repeat_password'); 
  13.   // 郵箱與手機號提供一個即可 
  14.   .xor('email', 'mobilePhone') 

數據校驗與路由層集成

由于數據直接從路由傳遞,因此 koajs 官方基于 joi 實現了一個 joi-router[4],前置數據校驗到路由層,對前端傳遞來的 query、body 與 params 進行校驗。

joi-router 也同時基于 co-body 對前端傳輸的各種 content-type 進行解析及限制。如限制為 application/json,也可在一定程度上防止 CSRF 攻擊。

  1. const router = require('koa-joi-router'); 
  2. const public = router(); 
  3.  
  4. public.route({ 
  5.   method: 'post', 
  6.   path: '/signup', 
  7.   validate: { 
  8.     header: joiObject, 
  9.     query: joiObject, 
  10.     params: joiObject, 
  11.     body: joiObject, 
  12.     maxBody: '64kb', 
  13.     output: { '400-600': { body: joiObject } }, 
  14.     type: 'json', 
  15.     failure: 400, 
  16.     continueOnError: false 
  17.   }, 
  18.   pre: async (ctx, next) => { 
  19.     await checkAuth(ctx); 
  20.     return next(); 
  21.   }, 
  22.   handler: async (ctx) => { 
  23.     await createUser(ctx.request.body); 
  24.     ctx.status = 201
  25.   }, 
  26. }); 

正則表達式與安全正則表達式

山月在一次排查性能問題時發現,一條 API 竟在數據校驗層耗時過久,這是我未曾想到的。而問題根源在于不安全的正則表達式,那什么叫做不安全的正則表達式呢?

比如下邊這個能把 CPU 跑掛的正則表達式就是一個定時炸彈,回溯次數進入了指數爆炸般的增長。

  1. const safe = require('safe-regex') 
  2. const re = /(x+x+)+y/ 
  3.  
  4. // 能跑死 CPU 的一個正則 
  5. re.test('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') 
  6.  
  7. // 使用 safe-regex 判斷正則是否安全 
  8. safe(re)   // false 

數據校驗,針對的大多是字符串校驗,也會充斥著各種各樣的正則表達式,保證正則表達式的安全相當緊要。safe-regex[6] 能夠發現哪些不安全的正則表達式。

總結

  • Controller 層需要進行統一的數據校驗,可以采用 JSON Schema (Node 實現 ajv) 與 Joi
  • JSON Schema 有官方規范及各個語言的實現,但語法繁瑣,可使用校驗功能更為強大的 Joi
  • 進行字符串校驗時,注意不安全的正則引起的性能問題

 

責任編輯:趙寧寧 來源: 全棧成長之路
相關推薦

2023-10-18 18:38:44

數據校驗業務

2025-02-10 10:29:32

2011-07-05 09:56:02

服務器虛擬化數據存儲

2021-06-11 06:00:37

蘋果Mac數據遷移

2022-11-02 14:45:24

Python數據分析工具

2019-09-27 12:44:03

數據建模企業數據存儲

2024-03-26 08:17:00

Controller參數校驗

2021-12-10 15:03:20

數字化轉型企業技術

2019-01-15 14:21:13

Python數據分析數據

2022-04-15 10:36:11

數據治理企業

2011-05-25 00:00:00

數據庫設計

2024-07-30 08:00:00

Kubernetes數據庫

2010-03-17 18:21:54

Java多線程靜態數據

2011-03-09 14:18:37

SQL數據累加

2017-10-31 11:55:46

sklearn數據挖掘自動化

2023-05-05 19:16:22

Python數據清洗

2009-09-10 23:17:33

ASP.NET Eva

2018-05-07 14:50:27

可視化數據散點圖

2024-10-28 12:57:36

Pandas數據清洗

2019-12-11 14:27:39

數據庫集群Kubernetes
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久色 | 国际精品久久 | 在线视频一区二区 | 久久久久成人精品免费播放动漫 | 国产亚洲一区在线 | 日日日视频| 不卡一二区 | 久久精品一区二区三区四区 | 免费能直接在线观看黄的视频 | 极品国产视频 | 天天草天天干 | 日韩一区二区三区av | 91久久伊人 | 91久久视频| 欧美日韩国产在线观看 | 国产精品精品视频一区二区三区 | 日韩免费一区 | 天天操伊人| 日本一本在线 | 精品免费国产一区二区三区 | 中文字幕日韩欧美一区二区三区 | 美女黄网 | 粉色午夜视频 | 国产日韩一区二区三免费高清 | 国产精品一区一区三区 | 精品二| 国产永久免费 | 盗摄精品av一区二区三区 | 天天色图 | 欧美一区二区成人 | 久久www免费视频 | 亚洲国产成人av好男人在线观看 | 99久久久国产精品 | 国产精品一区二区三区久久久 | 精品亚洲第一 | 久久99国产精一区二区三区 | 国内精品久久久久 | 91久久精品日日躁夜夜躁国产 | 国产精品久久久久久高潮 | 欧美一级α片 | 欧美高清hd |