iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

日常任務成長紀錄系列 第 17

nestJS-MicroService-gRpc 處理更新null情況

  • 分享至 

  • xImage
  •  
  • 前情提要&遭遇問題

    nestJs 是一個以express為基礎的後端框架,該框架可以選擇gRPC實作MicroService,並撰寫proto作為溝通介面,作為server來說,可以成功透過接收到資料,不過根據proto3三特性,選填、永不null、初始化給預設值,因此導致一情況,null欄位會消失,GET資料,null 欄位直接消,PATCH資料,null欄位送到server端一樣消失

    補充:

    • 架構:endPoint - MicroService
  • 研究歷程

    • Protobuf and Null Support
      • 三種處理Pattern: OneOf NullValue Pattern 、 FieldMask Pattern 、Has Pattern
      • 兩種避免使用情況:Default Value、Null String
      • 結果:
        • 三種建議Pattern,因都有使用到gRPC支援語言的內建方法,尚無找到在JS實作的方法,因此無法採用
        • 兩種避免情況,確實現在有如此的誤用,因此後續會避免,進而提出以下暫時解決方案
  • 解決方案

    • 目的:提供前端一致的串接體驗,只要是空值就送 null ,較為直覺
    • 針對 Patch 資料情境(只送需要更新欄位)
      1. endpoint 解析 FE request 找出 null 的欄位,記錄下來,繼續往microService丟
      2. 針對巢狀資料,需要一次送全部並字串化,因為在DB 是單一 column
    • 針對 Get 情況,還在想
    User Entity
    
    {
      "name":string
    	"phone":string
    	"age":number
    	"isVip":boolean
    	"createdAt":Datetime
    	"contactInfo":{  //for 支援jsonDB
    		"address":string
    		"email":string
    		}
    }
    
    //針對 Patch 資料情境(只送需要更新欄位)
    //1. endpoint 解析 FE request 找出 null 的欄位,記錄下來,繼續往microService丟
    //2. 針對巢狀資料,需要一次送全部並字串化,因為在DB 是單一 column 
    
    -- FE 傳送的req
    {
      "name":"王小明"
    	"phone":null
    	"age":number
    	"isVip":boolean
    	"createdAt":null
    	"contactInfo":{ 
    		"address":null
    		"email":"e@xample.com"
    		}
    }
    
    -- endpoint 傳給 microService 結構
    {
      "name":"王小明"
    	"phone":null
    	"age":number
    	"isVip":boolean
    	"createdAt":null
    	"contactInfo":'{"address":null,"email":"e@xample.com"}' //巢狀結構字串化
    	+ "setNullProperty":["phone","createdAt"] //直接紀錄需要null欄位
    }
    
    --proto
    
    message patchUser{
    	repreated string setNullProperty = 1
    	string name = 2
    	string phone = 3
    	number age = 4
    	boolean isVip = 5
    	string contactInfo = 6
    
    }
    

ref:

Protobuf and Null Support

Documentation | NestJS - A progressive Node.js framework


上一篇
TypeOrm | Repository APIs 用法紀錄 3
下一篇
過了一年,我更能享受其中了 謝謝你們
系列文
日常任務成長紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言