<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Nest.js 實(shí)踐總結(jié)分享

          共 3924字,需瀏覽 8分鐘

           ·

          2021-09-14 01:01

           大廠技術(shù)  高級(jí)前端  Node進(jìn)階

          點(diǎn)擊上方 程序員成長(zhǎng)指北,關(guān)注公眾號(hào)

          回復(fù)1,加入高級(jí)Node交流群

          Nest.js 是一個(gè)現(xiàn)代的企業(yè)級(jí) Node.js Web 框架,最近使用 Nest.js 實(shí)踐一些項(xiàng)目的總結(jié)了一些使用心得,也從中學(xué)到了很多東西,在這里總結(jié)下來(lái)和大家分享。

          1. API 設(shè)置全局前綴

          為 API 設(shè)置一個(gè)全局前綴可以區(qū)分接口版本,如通常會(huì)用 /api/v1 作為的 API 端點(diǎn)的前綴。為什么我們需要前綴?好的 API 在設(shè)計(jì)時(shí)要考慮到向后的兼容性。當(dāng)增強(qiáng)或增加一個(gè) API 時(shí),我們應(yīng)該確保已經(jīng)線上使用到該 API 的業(yè)務(wù)不受影響。簡(jiǎn)而言之,API 前綴是為了向后兼容。

          2. 模塊劃分

          Nest.js 是以模塊化結(jié)構(gòu)為基礎(chǔ)的,服務(wù)端應(yīng)用應(yīng)該按功能職責(zé)被劃分為幾個(gè)部分,通常情況下,將你的目錄結(jié)構(gòu)應(yīng)該按模塊劃分而不是按類型分成文件夾。以下是按類型劃分文件夾(不推薦):

          以下是按模塊劃分文件夾(推薦):

          對(duì)于 Nest.js,模塊是一個(gè)包含 .module.ts 文件的文件夾,其中包含一個(gè) @Module({}) 裝飾器。但并非每個(gè)文件夾都需要有一個(gè) .module.ts 文件。例如,你可以創(chuàng)建一個(gè)文件夾名為 utils 來(lái)存儲(chǔ)你的工具函數(shù)或 JSON 文件。通過(guò)將文件組織到模塊文件夾中,會(huì)變得清晰,并且可以避免很多錯(cuò)誤。此外,如果你不遵守此原則,Nest.js 可能會(huì)在構(gòu)建過(guò)程中崩潰。

          3. 使用 DTOs

          DTO = 數(shù)據(jù)傳輸對(duì)象。Dtos 就像接口,目標(biāo)是傳輸數(shù)據(jù)并驗(yàn)證它,主要用于路由器 / 控制器。你可以通過(guò)使用它們來(lái)簡(jiǎn)化 API 主體和查詢驗(yàn)證邏輯。例如,下面的 AuthDto 自動(dòng)將用戶電子郵件和密碼映射到對(duì)象 DTO 以強(qiáng)制驗(yàn)證。

          上面的例子是期望密碼超過(guò) 5 個(gè)字符,你可以將 dtos 與 class-validator 包配對(duì)以自動(dòng)拋出錯(cuò)誤。

          4. 應(yīng)該使用 Data Mapper/Repository 模式,而不是 Active Record

          如果你正在使用 PostgreSQL 或 MySQL 等關(guān)系數(shù)據(jù)庫(kù),那么請(qǐng)使用 TypeOrm,它是 Typescript 最強(qiáng)大的 ORM 之一。TypeOrm 可以使用兩種模式,一種是由 ruby on rails 推廣的活動(dòng)記錄模式,另一種是使用存儲(chǔ)庫(kù)的數(shù)據(jù)映射器模式。

          使用 Active Record 方法,可以在模型本身內(nèi)定義所有查詢方法,并使用模型方法保存、刪除和加載對(duì)象。下面是使用 Active Record 模式的樣子:

          const user = new UserEntity();
          user.name = "Vladimir";
          user.job = "programmer";
          await user.save();

          使用 Data Mapper 方法,你可以在稱為 “存儲(chǔ)庫(kù)” 的單獨(dú)類中定義所有查詢方法,并使用存儲(chǔ)庫(kù)保存、刪除和加載對(duì)象:

          const user = this.userRepository.create();
          user.name = "Vladimir";
          user.job = "programmer";
          await this.userRepository.save(user);

          雖然活動(dòng)記錄乍一看似乎更好,但它違背了 Nest.js 提供的模塊化,因?yàn)榛顒?dòng)記錄與全局實(shí)體一起工作,而數(shù)據(jù)映射器需要在使用它們之前將實(shí)體注入每個(gè)模塊。數(shù)據(jù)映射器可能看起來(lái)有點(diǎn)冗長(zhǎng),但它是中 / 大型項(xiàng)目的更好解決方案。它也非常適合測(cè)試,因?yàn)樗m用于依賴注入!

          5. 應(yīng)該使用相對(duì)路徑,而不是絕對(duì)路徑

          你可以使用絕對(duì)路徑或相對(duì)路徑導(dǎo)入 es6 模塊。但在 Nest.js 在開(kāi)發(fā)中使用絕對(duì)路徑,再構(gòu)建應(yīng)用時(shí)它會(huì)崩潰。

          // relative imports
          import { SecurityService } from '../security/security.service';
          import { CommentService } from '../comment/comment.service';


          // absolute imports
          import { SecurityService } from 'src/security/security.service';
          import { CommentService } from 'src/comment/comment.service';

          6. 使用 Exclude 來(lái)隱藏不必要的數(shù)據(jù)

          使用過(guò)濾器從數(shù)據(jù)庫(kù)中獲取的數(shù)據(jù)是很常見(jiàn)的。過(guò)濾器的整個(gè)目標(biāo)是刪除或格式化來(lái)自數(shù)據(jù)庫(kù)的數(shù)據(jù)。這會(huì)導(dǎo)致很多垃圾邏輯,使代碼變得更冗余。如果是需要隱藏某些字段,可以使用 @Exclude () 裝飾器。

          import { Exclude } from 'class-transformer';

          export class UserEntity {
            id: number;
            firstName: string;
            lastName: string;

            @Exclude()
            password: string;

            constructor(partial: Partial<UserEntity>) {
              Object.assign(this, partial);
            }
          }

          7. 使用實(shí)體的 getter 方法

          一些通用的邏輯可以作為屬性直接添加到你的實(shí)體邏輯里。最常見(jiàn)的用例與密碼散列和獲取全名有關(guān),這時(shí)可以使用 getter 方法,但是要注意不要過(guò)度使用,避免給實(shí)體承擔(dān)大量的業(yè)務(wù)邏輯。

          import { Exclude } from 'class-transformer';

          export class UserEntity {
            id: number;
            firstName: string;
            lastName: string;

            get fullName() {
              return this.firstName + " " + this.lastName;
            }
          }8. 使用集中命名導(dǎo)出

          你可以從同一個(gè)文件夾中導(dǎo)入所有類,而不是從不同的文件中導(dǎo)入你的類。如有以下目錄:

          // index.ts
          export * from './createPost.dto';
          export * from './editPost.dto';
          export * from './editPostCategory.dto';
          export * from './editPostStatus.dto';

          // 推薦 
          import { CreatePostDto, EditPostDto } from './dto';

          // 不推薦
          import { CreatePostDto } from './dto/createPost.dto';
          import { EditPostDto } from './dto/editPost.dto';


          Node 社群


          我組建了一個(gè)氛圍特別好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你對(duì)Node.js學(xué)習(xí)感興趣的話(后續(xù)有計(jì)劃也可以),我們可以一起進(jìn)行Node.js相關(guān)的交流、學(xué)習(xí)、共建。下方加 考拉 好友回復(fù)「Node」即可。


             “分享、點(diǎn)贊在看” 支持一波 

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三级经典在线 | 色婷婷基地 | 亚洲日韩国产精品 | 国精产品自偷自偷综合欧美 | 玖玖视频|