最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Javascript中使用DTO的示例詳解

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

什么是DTO

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

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

什么時(shí)候使用DTO?

很多開發(fā)人員在用 typescript/nodejs 開發(fā)復(fù)雜的應(yīng)用程序時(shí),都會(huì)使用 DTO 來表示他們的數(shù)據(jù)以及數(shù)據(jù)是如何傳輸?shù)綉?yīng)用程序的各個(gè)層的。這實(shí)際上是正確的,也是必需的。

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

為什么要在 Javascript 中使用 DTO?

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

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

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

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

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

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

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

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

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

實(shí)施和示例

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

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

我們將使用express驗(yàn)證器進(jìn)行如下驗(yàn)證:

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);
}

簡單服務(wù)層如下所示:

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

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

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

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

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

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

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

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

相關(guān)文章

  • JavaScript類型轉(zhuǎn)換方法及需要注意的問題小結(jié)(挺全面)

    JavaScript類型轉(zhuǎn)換方法及需要注意的問題小結(jié)(挺全面)

    JavaScript類型轉(zhuǎn)換方法及需要注意的問題,在js中經(jīng)常需要對數(shù)據(jù)類型的轉(zhuǎn)換操作,需要的朋友可以參考下。
    2010-11-11
  • JavaScript對象到原始值轉(zhuǎn)換機(jī)制詳解

    JavaScript對象到原始值轉(zhuǎn)換機(jī)制詳解

    JavaScript作為一門動(dòng)態(tài)類型語言,在處理對象與原始值之間的轉(zhuǎn)換時(shí)有一套獨(dú)特而精妙的機(jī)制,本文將深入剖析對象到原始值的轉(zhuǎn)換過程,從基本概念到內(nèi)部實(shí)現(xiàn)細(xì)節(jié),幫助開發(fā)者全面掌握這一重要特性,需要的朋友可以參考下
    2025-06-06
  • Next.js中處理時(shí)區(qū)的常用方案推薦

    Next.js中處理時(shí)區(qū)的常用方案推薦

    這篇文章主要為大家詳細(xì)介紹了Next.js中處理時(shí)區(qū)的幾種常用方案推薦,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • javascript中關(guān)于break,continue的特殊用法與介紹

    javascript中關(guān)于break,continue的特殊用法與介紹

    javascript大家所熟知中的for是一個(gè)循環(huán)體,循環(huán)體其中的break和continue也是大家都比較熟悉的功能,相信大家對它們的用法不會(huì)陌生,本文不是介紹其功能,本文假設(shè)你已經(jīng)熟悉break和continue的語意和用法
    2012-05-05
  • ES6中的Promise對象與async和await方法詳解

    ES6中的Promise對象與async和await方法詳解

    Promise是es6引入的異步編程薪解決方案,語法上promise就是一個(gè)構(gòu)造函數(shù),用來封裝異步操作病可以獲取其成功或失敗的結(jié)果,這篇文章主要介紹了ES6中的Promise對象與async和await方法,需要的朋友可以參考下
    2022-12-12
  • javascript實(shí)現(xiàn)可全選、反選及刪除表格的方法

    javascript實(shí)現(xiàn)可全選、反選及刪除表格的方法

    這篇文章主要介紹了javascript實(shí)現(xiàn)可全選、反選及刪除表格的方法,實(shí)例展示了javascript針對表格全選、反選、刪除、隔行變色、刪除提示等常用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • electron如何使用typescript

    electron如何使用typescript

    引入 TypeScript 到 Electron 項(xiàng)目可以幫助你捕捉錯(cuò)誤并在編寫代碼時(shí)提供更好的自動(dòng)完成和文檔,這篇文章主要介紹了electron使用typescript的步驟,需要的朋友可以參考下
    2024-04-04
  • 微信小程序開發(fā)之a(chǎn)nimation循環(huán)動(dòng)畫實(shí)現(xiàn)的讓云朵飄效果

    微信小程序開發(fā)之a(chǎn)nimation循環(huán)動(dòng)畫實(shí)現(xiàn)的讓云朵飄效果

    這篇文章主要介紹了微信小程序開發(fā)之a(chǎn)nimation循環(huán)動(dòng)畫實(shí)現(xiàn)的讓云朵飄效果,結(jié)合實(shí)例形式分析了animation結(jié)合js時(shí)間函數(shù)實(shí)現(xiàn)循環(huán)動(dòng)畫效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • JavaScript使用Webpack打包前端項(xiàng)目

    JavaScript使用Webpack打包前端項(xiàng)目

    在前端開發(fā)中,Webpack作為主流的模塊打包工具,能夠?qū)⒏鞣N資源整合為優(yōu)化的輸出文件,這篇文章主要介紹了JavaScript使用Webpack打包前端項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2026-02-02
  • JavaScript簡易計(jì)算器制作

    JavaScript簡易計(jì)算器制作

    這篇文章主要為大家詳細(xì)介紹了JavaScript簡易計(jì)算器制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01

最新評論

海阳市| 娱乐| 内江市| 北辰区| 诸城市| 垣曲县| 武宣县| 溧阳市| 青田县| 吉水县| 凤山市| 周宁县| 思茅市| 出国| 成武县| 峨眉山市| 东海县| 大庆市| 东城区| 攀枝花市| 武夷山市| 潜山县| 微山县| 石台县| 哈巴河县| 北安市| 河津市| 卓尼县| 贡觉县| 饶河县| 扶余县| 丹凤县| 寻甸| 荃湾区| 清涧县| 八宿县| 浑源县| 龙海市| 湘潭市| 南岸区| 永清县|