亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Javascript中使用DTO的示例詳解

 更新時間:2023年12月22日 08:23:02   作者:陳佬昔沒帶相機  
在我們討論實際實現(xiàn)之前,讓我們先介紹一下DTO,它的含義是什么,何時使用以及 javascript/nodejs 項目中對它的真正需求,需要的朋友可以參考下

什么是DTO

DTO 英文是 data transfer object 的縮寫,意思為“數(shù)據(jù)傳輸對象”,它是指定義了一個包含一組值或字段的容器,而不是解釋如何在層之間傳遞數(shù)據(jù)的方法。有些人混淆了定義數(shù)據(jù)庫模型(Modal)和DTO,記住這句話:

DTO 是用來操作和數(shù)據(jù)傳輸?shù)?,而模型則是用于數(shù)據(jù)持久性的。

什么時候使用DTO?

很多開發(fā)人員在用 typescript/nodejs 開發(fā)復雜的應用程序時,都會使用 DTO 來表示他們的數(shù)據(jù)以及數(shù)據(jù)是如何傳輸?shù)綉贸绦虻母鱾€層的。這實際上是正確的,也是必需的。

但我今天來告訴你,這也是javascript/nodejs 開發(fā)中所必需的,這樣做可以防止你的代碼變得糟糕??!

為什么要在 Javascript 中使用 DTO?

想象一下,你用 javascript 開發(fā)動態(tài)頁面,并使用 nodejs 開發(fā)rest API,你開始創(chuàng)建模型,做數(shù)據(jù)驗證,例如使用“express-validator”,并定義了你的路由、中間件,一起工作正常。

隨著需求的變化和代碼的頻繁更新,會有多個服務和多個 API 以不同的方式使用同一個模型,并且在每個服務中復制一些字段,以將它們從控制器(Controller)層傳遞到服務(Service)層,然后傳遞到負責將數(shù)據(jù)持久化到數(shù)據(jù)庫中的層。當一段時間后再看代碼,如果已經(jīng)看不明白什么數(shù)據(jù)應該傳遞給服務層,什么數(shù)據(jù)應該從這個服務返回,那么你就需要 DTO 了。

再想象一下,如果你在沒有嚴格的 schema 的情況下,連接到一個作為持久性數(shù)據(jù)庫或文檔數(shù)據(jù)庫的firebase,并且你將 json 數(shù)據(jù)作為端點,使用“express-validator”進行一些驗證,并將這些數(shù)據(jù)傳遞到服務層,然后這個服務層將這些數(shù)據(jù)傳輸?shù)匠志眯詫?,你需要的字段如下所示?/p>

{
    username: String,
    email: String,
    password: String
}

你如何保證 API 消費者可以發(fā)送更多的字段而不是定義的字段?例如,API 的消費者可以發(fā)送以下數(shù)據(jù):

{
  "username": "test",
  "email": "test@gmail.com",
  "password": "specificPass",
  "birthDate": "2022-05-09T20:12:13.318Z"
}

你看,我可以發(fā)送驗證中未定義的字段birthDate,這將違反服務的約定,這些數(shù)據(jù)也會被傳遞到持久層,并將保存在數(shù)據(jù)庫中。

同樣,假設有一個使用相同服務層的 API 和 web socket 連接,要如何定義兩者的驗證?你最終可能會在兩者中重復定義公開的數(shù)據(jù)!

在所有這些情況下,您都需要DTO。其背后的想法很簡單,它使你能夠描述如何在層中接收數(shù)據(jù)和公開數(shù)據(jù)。

實施和示例

最初,我們將 express js 路由定義如下:

router.post("/user/register", validations, registerController);

我們將使用express驗證器進行如下驗證:

const validations = [
  body("username").exists().isString().notEmpty(),
  body("email").exists().isEmail(),
  body("password").exists().isString().notEmpty(),
]

然后,控制器/處理程序如下所示:

const registerController = (req, res) => {
  const result = await userService.registerUser(req.body);
  return res.status(200).json(result);
}

簡單服務層如下所示:

const registerUser = (userData) => {
  userPersistenceLayer.add(userData);
}

現(xiàn)在,讓我們定義我們的基本DTO,但在此之前,讓我確保兩個事實:

  • DTO用于數(shù)據(jù)傳輸,數(shù)據(jù)庫模型用于數(shù)據(jù)持久性。
  • 將DTO視為一種約定,您可以使用此約定規(guī)范與其他人進行處理。約定規(guī)范是其中定義的字段
class RegisterUserDTO{
  username;
  email;
  password;
?
  constructor(data) {
    this.username = data.username;
    this.email = data.email;
    this.password = data.password;
  }
}

然后我們可以回到服務層并使用我們定義的DTO:

const registerUser = (userData) => {
  userPersistenceLayer.add(new RegisterUserDTO(userData));
}

正如您在這個模式中看到的那樣,我們正在控制傳遞數(shù)據(jù)的方式,并確保哪些字段被傳遞到其他層,我們還可以在這個DTO中設置一些getter和setter,以根據(jù)需要序列化/轉換一些數(shù)據(jù)。

希望你能清楚、順利地了解DTO模式。

到此這篇關于淺聊為什么在Javascript中使用 DTO的文章就介紹到這了,更多相關在Javascript中使用 DTO內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論