国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
關(guān)鍵要點(diǎn)
從 Express 遷移到 Fastify 的好處
如何自信地遷移 API
使用 fastify-express 從 Express 遷移到 Fastify
我們的示例 Express 應(yīng)用程序
必需的依賴項(xiàng)
路由模塊
app 模塊
服務(wù)器模塊
運(yùn)行我們的應(yīng)用程序
將我們的應(yīng)用程序從 Express 遷移到 Fastify
重構(gòu)我們的 app 模塊
重構(gòu)我們的服務(wù)器模塊
下一步
重構(gòu)我們的路由模塊
將中間件替換為插件
刪除 Express 依賴項(xiàng)
運(yùn)行我們遷移后的應(yīng)用程序
擺脫中間件
充分利用 Fastify
驗(yàn)證
日志記錄
錯(cuò)誤處理
裝飾器
結(jié)論
從 Express 遷移到 Fastify 的常見問題解答 (FAQ)
Express 和 Fastify 的主要區(qū)別是什么?
如何將我的 Express 應(yīng)用程序遷移到 Fastify?
我可以在 Fastify 中使用 Express 中間件嗎?
如何在 Fastify 中處理錯(cuò)誤?
如何在 Fastify 中使用鉤子?
如何在 Fastify 中使用插件?
如何在 Fastify 中定義路由?
如何在 Fastify 中發(fā)送響應(yīng)?
如何在 Fastify 中執(zhí)行驗(yàn)證?
Fastify 如何提高性能?
首頁 web前端 js教程 如何將您的應(yīng)用程序從Express遷移到快速

如何將您的應(yīng)用程序從Express遷移到快速

Feb 10, 2025 pm 02:50 PM

How to Migrate Your App from Express to Fastify

Express 曾是使用 Node.js 開發(fā) Web 應(yīng)用程序最流行的框架。然而,近年來該框架的活躍開發(fā)有所減少,導(dǎo)致其缺乏對(duì)現(xiàn)代 JavaScript 特性的支持。與此同時(shí),許多采用不同 Node.js 應(yīng)用程序開發(fā)方法的新框架涌現(xiàn),F(xiàn)astify 就是其中之一。

本文將探討 Fastify 成為 Node.js Web 應(yīng)用程序開發(fā)中引人注目的替代方案的原因。我們將學(xué)習(xí)如何避免從頭重寫現(xiàn)有的 Express 應(yīng)用程序,而是逐步遷移到 Fastify。學(xué)習(xí)完本文后,您將能夠自信地遷移現(xiàn)有的 Express 應(yīng)用程序,并開始利用 Fastify 框架的優(yōu)勢(shì)。

閱讀本文需要滿足以下條件:

  • 熟悉創(chuàng)建基本的 Express 應(yīng)用程序、定義路由和配置中間件。
  • 熟悉在終端運(yùn)行命令。
  • 已安裝 Node.js >= v14.13.0。這為我們提供了對(duì) ECMAScript (ES) 模塊的良好支持,并允許我們使用頂級(jí) await。本文中的代碼示例使用 ES 模塊語法 (import / export)。

本文中的所有示例代碼都可以在 GitHub 上找到,您可以瀏覽、下載和試驗(yàn)。

我的網(wǎng)站上也提供本文的視頻版本。

關(guān)鍵要點(diǎn)

  • 與 Express 相比,F(xiàn)astify 提供內(nèi)置的驗(yàn)證和日志記錄、原生異步支持和自動(dòng) JSON 解析,從而提高了開發(fā)效率和應(yīng)用程序性能。
  • fastify-express 插件通過允許在 Fastify 框架中使用 Express 中間件和路由,從而促進(jìn)了從 Express 到 Fastify 的逐步遷移。
  • 集成測(cè)試應(yīng)該與框架無關(guān),以確保它們?cè)谶w移前后仍然有效,從而簡(jiǎn)化測(cè)試過程。
  • 重構(gòu)包括用 Fastify 等效項(xiàng)替換 Express 代碼,例如使用 Fastify 的路由和插件系統(tǒng)來代替 Express 路由器和中間件。
  • 遷移過程可以分階段進(jìn)行,首先將 Fastify 集成到現(xiàn)有的 Express 應(yīng)用程序中,然后逐步替換 Express 組件。
  • 遷移后,務(wù)必將第三方 Express 中間件替換為等效的 Fastify 插件,以充分利用 Fastify 的性能和功能。

從 Express 遷移到 Fastify 的好處

如果您熟悉使用 Express 構(gòu)建 Node.js 應(yīng)用程序,您可能想知道將現(xiàn)有的 Express 應(yīng)用程序遷移到 Fastify 的好處是什么。以下是考慮遷移的一些重要原因:

  • 開箱即用的驗(yàn)證和日志記錄。這些功能在構(gòu)建 Web 應(yīng)用程序時(shí)通常是必需的。使用 Fastify 時(shí),無需選擇和集成這些任務(wù)的庫,因?yàn)樗鼮槲覀兲峁┝诉@些功能。我們將在本文后面詳細(xì)了解這些功能。

  • 對(duì)異步代碼的原生支持。Fastify 原生處理 Promise 并支持 async/await。這意味著路由將為我們捕獲未捕獲的已拒絕 Promise。這允許我們安全地編寫異步代碼。它還允許我們做一些簡(jiǎn)潔的事情,例如自動(dòng)將路由處理程序函數(shù)的返回值作為響應(yīng)正文發(fā)送:

    <code>  app.get("/user/:id", async (request) => await getUser(request.params.id));
    </code>
  • 自動(dòng)解析和序列化 JSON。我們不需要配置 Fastify 來解析 JSON 請(qǐng)求正文,也不需要將對(duì)象序列化為 JSON 以進(jìn)行響應(yīng)。它會(huì)自動(dòng)為我們處理所有這些:

    <code>  app.get("/user/:id", async (request, reply) => {
        const name = request.body.name;
    
        reply.send({ user: { name } });
      });
    </code>
  • 開發(fā)者友好。憑借明確且表達(dá)力強(qiáng)的 API,以及對(duì) TypeScript 的出色支持,F(xiàn)astify 的設(shè)計(jì)考慮到了開發(fā)者體驗(yàn)。

  • 速度快。我們不希望框架成為應(yīng)用程序中性能瓶頸的來源。好消息是 Fastify 的構(gòu)建旨在實(shí)現(xiàn)高性能。Fastify 基準(zhǔn)測(cè)試顯示了它與其他 Node.js Web 框架相比的情況。

  • 積極開發(fā)中。Fastify 框架正在積極開發(fā)中。定期發(fā)布改進(jìn)和錯(cuò)誤/安全修復(fù)。

如何自信地遷移 API

我們希望在應(yīng)用程序遷移到 Fastify 后,確信它仍然按預(yù)期工作。有助于我們發(fā)現(xiàn)錯(cuò)誤或識(shí)別意外更改的一件事是 API 集成測(cè)試。

集成測(cè)試以與單元測(cè)試不同的方式來測(cè)試應(yīng)用程序的組件。單元測(cè)試單獨(dú)測(cè)試各個(gè)組件的功能。集成測(cè)試允許我們驗(yàn)證多個(gè)組件協(xié)同工作的行為。

如果我們?yōu)?Express 應(yīng)用程序編寫 API 集成測(cè)試,我們希望能夠在將應(yīng)用程序遷移到 Fastify 后運(yùn)行相同的測(cè)試。在為 API 編寫集成測(cè)試時(shí),需要考慮以下幾點(diǎn):

  • 它們不應(yīng)該與特定框架綁定。我們希望能夠在遷移前后運(yùn)行相同的測(cè)試,而無需更改測(cè)試或我們正在使用的任何庫。
  • 保持簡(jiǎn)單。至少,集成測(cè)試應(yīng)該向 API 公開的端點(diǎn)發(fā)出請(qǐng)求,并驗(yàn)證是否返回了響應(yīng),但通常不會(huì)更多。我們可能希望檢查特定的 HTTP 狀態(tài)代碼或響應(yīng)標(biāo)頭,但我們應(yīng)該盡量使測(cè)試盡可能簡(jiǎn)單。
  • 選擇您熟悉的工具。有很多不同的工具可以幫助我們創(chuàng)建和運(yùn)行 API 測(cè)試,但重要的是使用我們熟悉的工具。要編寫有效的集成測(cè)試,我們需要能夠發(fā)出 HTTP 請(qǐng)求并對(duì)來自我們 API 的響應(yīng)進(jìn)行斷言。一般來說,我們不需要很多庫或工具來實(shí)現(xiàn)這一點(diǎn)。

我們不會(huì)在本文中詳細(xì)介紹如何實(shí)現(xiàn) API 集成測(cè)試,但您應(yīng)該在進(jìn)行框架遷移之前考慮編寫它們。

使用 fastify-express 從 Express 遷移到 Fastify

將現(xiàn)有的 Express 應(yīng)用程序遷移到完全不同的框架的想法可能看起來相當(dāng)令人生畏。幸運(yùn)的是,F(xiàn)astify 團(tuán)隊(duì)創(chuàng)建了一個(gè)插件——fastify-express——可以幫助簡(jiǎn)化遷移路徑。

fastify-express 插件為 Fastify 添加了完全的 Express 兼容性。它提供了一個(gè) use() 方法,我們可以使用它將 Express 中間件和路由添加到我們的 Fastify 服務(wù)器。這使我們可以選擇逐步將現(xiàn)有 Express 應(yīng)用程序的部分遷移到 Fastify。

這是一個(gè) Express 路由器的示例:

<code>  app.get("/user/:id", async (request) => await getUser(request.params.id));
</code>

然后,我們可以使用 fastify-express 將我們現(xiàn)有的 Express 路由器添加到 Fastify 服務(wù)器實(shí)例:

<code>  app.get("/user/:id", async (request, reply) => {
    const name = request.body.name;

    reply.send({ user: { name } });
  });
</code>

稍后,當(dāng)我們開始將應(yīng)用程序遷移到 Fastify 時(shí),我們將探討所有這些工作原理的細(xì)節(jié)。

重要的是要注意,使用 fastify-express 插件不是長期的解決方案。如果我們想要獲得 Fastify 的全部好處,我們最終需要遷移我們的 Express 特定應(yīng)用程序代碼。但是,fastify-express 插件為我們提供了分階段遷移到 Fastify 的機(jī)會(huì)。

我們的示例 Express 應(yīng)用程序

我們將構(gòu)建一個(gè)示例 Express 應(yīng)用程序,然后將其遷移到使用 Fastify 框架?,F(xiàn)在讓我們來看一下它的代碼。

必需的依賴項(xiàng)

首先,讓我們創(chuàng)建一個(gè)新項(xiàng)目:

<code>// src/routes.js
const router = express.Router();

router.get("/:user_id", function getUser(request, response, next) {
  response.json({});
});

export default router;
</code>

然后,我們將在終端中運(yùn)行此命令來安裝我們的 Express 應(yīng)用程序所需的依賴項(xiàng):

<code>// src/server.js

import Fastify from "fastify";
import ExpressPlugin from "fastify-express";

import routes from "./routes.js";

const fastify = Fastify();

await fastify.register(ExpressPlugin);

fastify.use("/user", routes);

await fastify.listen(3000);
</code>

最后,打開 package.json 并將以下行添加到 scripts 部分上方:

<code>mkdir express-to-fastify-migration
cd express-to-fastify-migration
npm init -y
</code>

這將允許我們?cè)谖覀兊膽?yīng)用程序中加載 ES 模塊。

路由模塊

我們將創(chuàng)建一個(gè) Express 路由器實(shí)例來幫助我們封裝我們的路由和中間件。Express 中的路由器可以用來幫助我們將應(yīng)用程序組織成離散的模塊。例如,我們可能有一個(gè)用于 /user 路由的路由器,另一個(gè)用于 /address 路由的路由器。我們稍后將看到這如何幫助我們分階段將 Express 應(yīng)用程序遷移到 Fastify。

讓我們創(chuàng)建一個(gè)路由器實(shí)例并向其添加一些中間件:

<code>npm install express cors
</code>

在上面的代碼中,我們配置了兩個(gè) Express 中間件示例:

  • express.json()。此中間件函數(shù)內(nèi)置于 Express 中。它處理解析 JSON 請(qǐng)求正文。
  • cors。此中間件幫助我們將 CORS 標(biāo)頭添加到我們的 API 響應(yīng)中。它將允許從網(wǎng)頁調(diào)用我們的 API。

這些中間件工具將針對(duì)我們?cè)诖寺酚善魃隙x的任何路由發(fā)出的任何請(qǐng)求運(yùn)行。

現(xiàn)在我們已經(jīng)配置了中間件,我們可以將第一個(gè)路由添加到我們的路由器:

<code>"type": "module",
</code>

在一個(gè)真實(shí)的應(yīng)用程序中,上面的路由處理程序函數(shù)將驗(yàn)證它接收到的數(shù)據(jù),然后調(diào)用數(shù)據(jù)庫以創(chuàng)建一個(gè)新的用戶記錄。對(duì)于此示例,我們正在發(fā)送作為響應(yīng)正文接收到的數(shù)據(jù)。

現(xiàn)在我們將添加一個(gè)用于檢索用戶的路由:

<code>  app.get("/user/:id", async (request) => await getUser(request.params.id));
</code>

與 POST 路由一樣,上面的路由處理程序通常會(huì)調(diào)用數(shù)據(jù)庫來檢索用戶數(shù)據(jù),但對(duì)于此示例,我們已硬編碼一個(gè)對(duì)象以在響應(yīng)正文中發(fā)送。

最后,我們將導(dǎo)出路由器對(duì)象,以便我們可以在另一個(gè)模塊中導(dǎo)入它:

<code>  app.get("/user/:id", async (request, reply) => {
    const name = request.body.name;

    reply.send({ user: { name } });
  });
</code>

app 模塊

現(xiàn)在我們將創(chuàng)建一個(gè) app 模塊:

<code>// src/routes.js
const router = express.Router();

router.get("/:user_id", function getUser(request, response, next) {
  response.json({});
});

export default router;
</code>

在此模塊中,我們定義了一個(gè)函數(shù),該函數(shù)創(chuàng)建一個(gè)新的 Express 服務(wù)器實(shí)例。然后,我們將路由器對(duì)象添加到服務(wù)器實(shí)例。

服務(wù)器模塊

最后,我們將創(chuàng)建一個(gè)服務(wù)器模塊。此模塊使用我們?cè)?app 模塊中定義的 buildApp() 函數(shù)來創(chuàng)建一個(gè)新的 Express 服務(wù)器實(shí)例。然后,它通過將其配置為偵聽端口 3000 來啟動(dòng)我們的 Express 服務(wù)器:

<code>// src/server.js

import Fastify from "fastify";
import ExpressPlugin from "fastify-express";

import routes from "./routes.js";

const fastify = Fastify();

await fastify.register(ExpressPlugin);

fastify.use("/user", routes);

await fastify.listen(3000);
</code>

運(yùn)行我們的應(yīng)用程序

我們現(xiàn)在有一個(gè)完整的可運(yùn)行的 Express 應(yīng)用程序,我們可以在終端中運(yùn)行它:

<code>mkdir express-to-fastify-migration
cd express-to-fastify-migration
npm init -y
</code>

在另一個(gè)終端中,我們可以使用 cURL 向 API 發(fā)出請(qǐng)求以確認(rèn)它是否正在工作:

<code>npm install express cors
</code>

我們應(yīng)該收到一個(gè)如下所示的響應(yīng):

<code>"type": "module",
</code>

將我們的應(yīng)用程序從 Express 遷移到 Fastify

現(xiàn)在我們已經(jīng)擁有了一個(gè)功能齊全的 Express 應(yīng)用程序,我們將將其遷移到使用 Fastify 框架。

必需的依賴項(xiàng)

我們需要安裝三個(gè)依賴項(xiàng):

  • Fastify 框架
  • fastify-express 插件
  • fastify-cors 插件——這是我們的應(yīng)用程序已經(jīng)使用的 Express cors 中間件的移植版本

讓我們?cè)诮K端中運(yùn)行此命令來安裝它們:

<code>// src/routes.js

import express from "express";
import cors from "cors";

const router = express.Router();

router.use(express.json());

router.use(cors({ origin: true }));
</code>

您可以在 GitHub 上查看這些代碼更改的差異。

重構(gòu)我們的 app 模塊

現(xiàn)在我們已經(jīng)安裝了依賴項(xiàng),我們需要重構(gòu)我們的 app 模塊。我們將將其更改為:

  • 導(dǎo)入 fastify 和 fastify-express 而不是 express
  • 創(chuàng)建 Fastify 服務(wù)器實(shí)例而不是 Express 服務(wù)器實(shí)例
  • 使用 fastify-express 插件將我們的 Express 路由器對(duì)象添加到服務(wù)器

這是我們進(jìn)行這些更改后的樣子:

<code>// src/routes.js

router.post("/", function createUser(request, response, next) {
  const newUser = request.body;

  if (!newUser) {
    return next(new Error("Error creating user"));
  }

  response.status(201).json(newUser);
});
</code>

您可以在 GitHub 上查看這些代碼更改的差異。

您會(huì)在上面的代碼中注意到,當(dāng)我們創(chuàng)建 Fastify 服務(wù)器實(shí)例時(shí),我們正在傳遞 logger 選項(xiàng)。這啟用了 Fastify 的內(nèi)置日志記錄功能。我們稍后將詳細(xì)了解這一點(diǎn)。

重構(gòu)我們的服務(wù)器模塊

現(xiàn)在我們需要更改我們的服務(wù)器模塊以與 Fastify 服務(wù)器實(shí)例一起工作:

<code>// src/routes.js

router.get("/:user_id", function getUser(request, response, next) {
  const user = {
    id: request.params.user_id,
    first_name: "Bobinsky",
    last_name: "Oso",
  };

  response.json(user);
});
</code>

您可以在 GitHub 上查看這些代碼更改的差異。

由于 Fastify 原生支持 Promise,因此在上面的代碼中,我們可以使用 await,然后使用 Fastify 的內(nèi)置日志記錄功能捕獲并記錄任何錯(cuò)誤。

下一步

我們的應(yīng)用程序現(xiàn)在使用 Fastify 來路由請(qǐng)求和發(fā)送響應(yīng)。它功能齊全,但我們的路由仍在使用 Express。為了完全遷移到 Express,我們需要將我們的路由遷移到也使用 Fastify。

重構(gòu)我們的路由模塊

Express 應(yīng)用程序中的路由封裝在 Express 路由器中。我們將此路由器重構(gòu)為 Fastify 插件。插件是 Fastify 的一項(xiàng)功能,允許我們封裝路由和任何相關(guān)功能。

我們將從刪除一些 Express 特定的行開始重構(gòu)我們的路由模塊 (src/routes.js):

<code>  app.get("/user/:id", async (request) => await getUser(request.params.id));
</code>

然后我們需要將默認(rèn)模塊導(dǎo)出更改為接受 Fastify 服務(wù)器實(shí)例的異步函數(shù)。這是 Fastify 插件的基礎(chǔ)。我們的路由模塊中的其余代碼將移動(dòng)到此插件函數(shù)中:

<code>  app.get("/user/:id", async (request, reply) => {
    const name = request.body.name;

    reply.send({ user: { name } });
  });
</code>

為了使我們的中間件和路由與 Fastify 一起工作,我們需要更改:

  • 將路由器引用更改為 fastify
  • 將路由處理程序函數(shù)更改為異步函數(shù)
  • 將路由處理程序函數(shù)參數(shù)從 (request, response, next) 更改為 (request, reply)
  • 將響應(yīng)引用更改為 reply
  • 將 response.json() 調(diào)用更改為 reply.send()
  • 將 next(error) 實(shí)例更改為 throw error

進(jìn)行所有這些更改后,我們的路由模塊現(xiàn)在是一個(gè)包含 Fastify 路由的 Fastify 插件:

<code>// src/routes.js
const router = express.Router();

router.get("/:user_id", function getUser(request, response, next) {
  response.json({});
});

export default router;
</code>

現(xiàn)在我們需要更改我們的 app 模塊 (src/app.js) 以使用我們從路由模塊導(dǎo)出的插件。這意味著用對(duì) fastify.register() 的調(diào)用替換 fastify.use() 調(diào)用:

<code>// src/server.js

import Fastify from "fastify";
import ExpressPlugin from "fastify-express";

import routes from "./routes.js";

const fastify = Fastify();

await fastify.register(ExpressPlugin);

fastify.use("/user", routes);

await fastify.listen(3000);
</code>

您可以在 GitHub 上查看這些代碼更改的差異。

我們的示例 Express 應(yīng)用程序只有一個(gè)路由器,因此我們可以一次性將應(yīng)用程序中的所有路由遷移到使用 Fastify。但是,如果我們有一個(gè)更大的 Express 應(yīng)用程序,其中有多個(gè)路由器,我們可以一次逐步將每個(gè)路由器遷移到 Fastify。

將中間件替換為插件

我們的應(yīng)用程序狀況良好,我們幾乎已經(jīng)完全將其從 Express 遷移到 Fastify。還有一件事需要遷移:我們對(duì) cors Express 中間件包的使用。我們之前安裝了 fastify-cors 插件,現(xiàn)在我們需要在我們的應(yīng)用程序中添加它以替換 cors 中間件。

在我們的路由模塊 (src/routes.js) 中,我們需要替換 cors 中間件的導(dǎo)入:

<code>mkdir express-to-fastify-migration
cd express-to-fastify-migration
npm init -y
</code>

然后我們需要用對(duì) fastify.register() 的調(diào)用替換對(duì) fastify.use() 的調(diào)用:

<code>npm install express cors
</code>

請(qǐng)注意,當(dāng)我們將插件與 Fastify 注冊(cè)時(shí),我們需要將插件函數(shù)和選項(xiàng)對(duì)象作為單獨(dú)的參數(shù)傳遞。

由于我們不再使用 fastify-express 插件提供的 use() 函數(shù),因此我們可以將其完全從我們的應(yīng)用程序中刪除。為此,讓我們從我們的 app 模塊 (src/app.js) 中刪除以下幾行:

<code>  app.get("/user/:id", async (request) => await getUser(request.params.id));
</code>

您可以在 GitHub 上查看這些代碼更改的差異。

刪除 Express 依賴項(xiàng)

我們的應(yīng)用程序從 Express 到 Fastify 的遷移已完成!我們現(xiàn)在可以通過在終端中運(yùn)行此命令來刪除 Express 相關(guān)的依賴項(xiàng):

<code>  app.get("/user/:id", async (request, reply) => {
    const name = request.body.name;

    reply.send({ user: { name } });
  });
</code>

您可以在 GitHub 上查看這些代碼更改的差異。

運(yùn)行我們遷移后的應(yīng)用程序

現(xiàn)在我們已經(jīng)將應(yīng)用程序完全遷移到 Fastify,現(xiàn)在是檢查一切是否仍按預(yù)期工作的好時(shí)機(jī)。讓我們運(yùn)行我們之前在應(yīng)用程序使用 Express 時(shí)運(yùn)行的相同命令。

首先,我們將在終端中運(yùn)行應(yīng)用程序:

<code>// src/routes.js
const router = express.Router();

router.get("/:user_id", function getUser(request, response, next) {
  response.json({});
});

export default router;
</code>

然后,在另一個(gè)終端中,我們將使用 cURL 向 API 發(fā)出請(qǐng)求以確認(rèn)它是否按預(yù)期工作:

<code>// src/server.js

import Fastify from "fastify";
import ExpressPlugin from "fastify-express";

import routes from "./routes.js";

const fastify = Fastify();

await fastify.register(ExpressPlugin);

fastify.use("/user", routes);

await fastify.listen(3000);
</code>

我們應(yīng)該收到一個(gè)如下所示的響應(yīng):

<code>mkdir express-to-fastify-migration
cd express-to-fastify-migration
npm init -y
</code>

擺脫中間件

我們的示例 Express 應(yīng)用程序只使用了一些中間件函數(shù),但我們現(xiàn)實(shí)世界的 Express 應(yīng)用程序可能使用了更多。正如我們所看到的,fastify-express 插件允許我們繼續(xù)使用 Express 中間件(如果需要)。這使我們可以推遲將我們自己的自定義 Express 中間件重寫為 Fastify 插件。但是,我們?nèi)绾翁鎿Q第三方 Express 中間件呢?

幸運(yùn)的是,F(xiàn)astify 提供了一個(gè)健康的插件生態(tài)系統(tǒng)。以下是一些我們可以用 Fastify 插件替換的流行 Express 中間件包:

  • cors ? fastify-cors
  • helmet ? fastify-helmet
  • csurf ? fastify-csrf
  • express-session ? fastify-server-session
  • express-jwt ? fastify-jwt
  • http-errors ? fastify-sensible
  • serve-static ? fastify-static
  • multer ? fastify-multer

一些 Fastify 插件是其 Express 對(duì)應(yīng)項(xiàng)的直接移植或包裝器。這意味著我們通常不需要更改傳遞給 Fastify 插件的配置選項(xiàng)。

您可以在 Fastify 生態(tài)系統(tǒng)頁面上找到完整的插件列表。

充分利用 Fastify

現(xiàn)在我們已經(jīng)開始通過遷移 Express 應(yīng)用程序來熟悉 Fastify,現(xiàn)在是時(shí)候開始查看我們可以從中受益的其他 Fastify 功能了。

驗(yàn)證

Fastify 提供了請(qǐng)求驗(yàn)證功能。它在后臺(tái)使用 Ajv(另一個(gè) JSON 模式驗(yàn)證器),這允許我們使用 JSON Schema 定義驗(yàn)證規(guī)則。

這是一個(gè)使用 JSON 模式來驗(yàn)證 POST 路由上請(qǐng)求正文的示例:

<code>npm install express cors
</code>

驗(yàn)證錯(cuò)誤會(huì)自動(dòng)格式化并作為 JSON 響應(yīng)發(fā)送:

<code>"type": "module",
</code>

在 Fastify 驗(yàn)證和序列化文檔中了解更多信息。

日志記錄

Node.js 應(yīng)用程序中的日志記錄可能會(huì)對(duì)生產(chǎn)環(huán)境中的性能產(chǎn)生負(fù)面影響。這是因?yàn)樾蛄谢蛯⑷罩緮?shù)據(jù)傳輸?shù)狡渌胤剑ɡ?,?Elasticsearch)涉及許多步驟。此應(yīng)用程序方面的高度優(yōu)化非常重要。

日志記錄已完全集成到 Fastify 中,這意味著我們不需要花費(fèi)時(shí)間選擇和集成日志記錄器。Fastify 使用快速靈活的日志記錄器:pino。它以 JSON 格式生成日志:

<code>  app.get("/user/:id", async (request) => await getUser(request.params.id));
</code>

當(dāng)我們創(chuàng)建 Fastify 服務(wù)器實(shí)例時(shí),我們可以啟用日志記錄并自定義傳遞給 pino 的選項(xiàng)。然后,F(xiàn)astify 將自動(dòng)輸出如上所示的日志消息。日志記錄器實(shí)例在 Fastify 服務(wù)器實(shí)例 (例如 fastify.log.info("...")) 和所有請(qǐng)求對(duì)象 (例如 request.log.info("...")) 上可用。

在 Fastify 日志記錄文檔中了解更多信息。

錯(cuò)誤處理

Fastify 提供了一個(gè) setErrorHandler() 方法,允許我們明確指定錯(cuò)誤處理函數(shù)。這與 Express 不同,在 Express 中,錯(cuò)誤處理中間件只能通過它接受的參數(shù) (err, req, res, next) 來區(qū)分,并且必須以特定的順序添加。

為了獲得完全的靈活性,我們可以在不同的插件中指定不同的 Fastify 錯(cuò)誤處理程序。在 Fastify 錯(cuò)誤文檔中了解更多信息。

裝飾器

裝飾器是 Fastify 中的一項(xiàng)強(qiáng)大功能,允許我們自定義核心 Fastify 對(duì)象——例如我們的 Fastify 服務(wù)器實(shí)例——以及請(qǐng)求和回復(fù)對(duì)象。這是一個(gè)基本裝飾器的示例:

<code>  app.get("/user/:id", async (request, reply) => {
    const name = request.body.name;

    reply.send({ user: { name } });
  });
</code>

裝飾器允許我們將數(shù)據(jù)庫連接或視圖引擎等內(nèi)容在整個(gè) Fastify 應(yīng)用程序中使用。在 Fastify 裝飾器文檔中了解更多信息。

結(jié)論

在本文中,我們學(xué)習(xí)了如何將現(xiàn)有的 Node.js 應(yīng)用程序從 Express 遷移到 Fastify。我們已經(jīng)了解了 fastify-express 插件如何幫助我們逐步遷移現(xiàn)有應(yīng)用程序。這使我們可以開始受益于 Fastify 提供的功能,即使我們的應(yīng)用程序的部分仍在使用 Express。

以下是一些您在從 Express 遷移到 Fastify 時(shí)可能會(huì)發(fā)現(xiàn)有用的資源:

  • 本文中的示例代碼。探索代碼并運(yùn)行我們?cè)诒疚闹袠?gòu)建的應(yīng)用程序。
  • Fastify 文檔。Fastify 框架的全面文檔。
  • Fastify 生態(tài)系統(tǒng)。Fastify 插件的目錄。方便查找用于替換 Express 中間件的插件。
  • Fastify 示例應(yīng)用程序。由 Fastify 的主要維護(hù)者之一創(chuàng)建的示例應(yīng)用程序。它演示了核心 Fastify 概念、最佳實(shí)踐和建議。
  • Fastify 社區(qū) Discord 服務(wù)器。一個(gè)獲得有關(guān)使用 Fastify 開發(fā)應(yīng)用程序的幫助和建議的好地方。

從 Express 遷移到 Fastify 的常見問題解答 (FAQ)

Express 和 Fastify 的主要區(qū)別是什么?

Express 和 Fastify 都是 Node.js 的 Web 框架,但它們有一些關(guān)鍵區(qū)別。Express 是一個(gè)極簡(jiǎn)的 Web 應(yīng)用程序框架,提供了一個(gè)簡(jiǎn)單的界面來構(gòu)建 Web 應(yīng)用程序和 API。它已經(jīng)存在很長時(shí)間了,擁有龐大的社區(qū)和豐富的中間件。另一方面,F(xiàn)astify 是一個(gè)較新的框架,專注于以最少的開銷和強(qiáng)大的插件架構(gòu)提供最佳的開發(fā)者體驗(yàn)。它的設(shè)計(jì)速度很快,因此得名,基準(zhǔn)測(cè)試表明它每秒可以處理比 Express 更多的請(qǐng)求。

如何將我的 Express 應(yīng)用程序遷移到 Fastify?

從 Express 遷移到 Fastify 包括幾個(gè)步驟。首先,您需要安裝 Fastify 并將應(yīng)用程序中的 Express 實(shí)例替換為 Fastify 實(shí)例。然后,您需要將 Express 特定的中間件替換為 Fastify 插件或自定義代碼。您還需要更新您的路由以使用 Fastify 的路由系統(tǒng)。最后,您需要更新您的錯(cuò)誤處理代碼以使用 Fastify 的錯(cuò)誤處理機(jī)制。

我可以在 Fastify 中使用 Express 中間件嗎?

Fastify 有自己的中間件系統(tǒng),但它也通過“middie”插件支持 Express 風(fēng)格的中間件。但是,在 Fastify 中使用 Express 中間件可能會(huì)影響性能,因此建議盡可能使用 Fastify 插件或自定義代碼。

如何在 Fastify 中處理錯(cuò)誤?

Fastify 具有內(nèi)置的錯(cuò)誤處理機(jī)制,您可以使用它來處理應(yīng)用程序中的錯(cuò)誤。您可以為特定路由或整個(gè)應(yīng)用程序定義自定義錯(cuò)誤處理程序。Fastify 還支持 async/await 語法,這使得錯(cuò)誤處理比 Express 更直接。

如何在 Fastify 中使用鉤子?

鉤子是 Fastify 中的一項(xiàng)強(qiáng)大功能,允許您在請(qǐng)求/響應(yīng)生命周期的不同階段運(yùn)行自定義代碼。您可以使用鉤子來修改請(qǐng)求或響應(yīng)、執(zhí)行身份驗(yàn)證、記錄請(qǐng)求等等。Fastify 支持多個(gè)鉤子,包括“onRequest”、“preHandler”、“onSend”和“onResponse”。

如何在 Fastify 中使用插件?

插件是 Fastify 的一個(gè)關(guān)鍵功能,允許您擴(kuò)展應(yīng)用程序的功能。您可以使用插件來添加新功能、與其他服務(wù)集成或封裝應(yīng)用程序邏輯。Fastify 擁有豐富的插件生態(tài)系統(tǒng),您也可以創(chuàng)建自己的插件。

如何在 Fastify 中定義路由?

Fastify 擁有一個(gè)強(qiáng)大的路由系統(tǒng),支持參數(shù)、查詢字符串、通配符等等。您可以使用“route”方法定義路由,該方法接受一個(gè)選項(xiàng)對(duì)象,該對(duì)象指定路由的方法、URL、處理程序和其他選項(xiàng)。

如何在 Fastify 中發(fā)送響應(yīng)?

在 Fastify 中,您可以使用傳遞給路由處理程序的“reply”對(duì)象發(fā)送響應(yīng)?!皉eply”對(duì)象有幾種方法可以發(fā)送響應(yīng),包括“send”、“code”、“header”和“type”。Fastify 還自動(dòng)序列化 JSON 響應(yīng)以提高性能。

如何在 Fastify 中執(zhí)行驗(yàn)證?

Fastify 使用 JSON Schema 支持請(qǐng)求和響應(yīng)驗(yàn)證。您可以為路由定義模式,F(xiàn)astify 將自動(dòng)根據(jù)這些模式驗(yàn)證傳入的請(qǐng)求和傳出的響應(yīng)。這有助于盡早發(fā)現(xiàn)錯(cuò)誤并提高應(yīng)用程序的可靠性。

Fastify 如何提高性能?

Fastify 的設(shè)計(jì)目的是快速高效。它使用輕量級(jí)架構(gòu),支持 HTTP/2 和 HTTP/3,并擁有強(qiáng)大的插件系統(tǒng),可最大限度地減少開銷。Fastify 還自動(dòng)序列化 JSON 響應(yīng)并支持請(qǐng)求和響應(yīng)驗(yàn)證,這有助于提高性能。

以上是如何將您的應(yīng)用程序從Express遷移到快速的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

為什么要將標(biāo)簽放在的底部? 為什么要將標(biāo)簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助于精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

JavaScript模塊上的確定JS綜述:ES模塊與COMPORJS JavaScript模塊上的確定JS綜述:ES模塊與COMPORJS Jul 02, 2025 am 01:28 AM

ES模塊和CommonJS的主要區(qū)別在于加載方式和使用場(chǎng)景。1.CommonJS是同步加載,適用于Node.js服務(wù)器端環(huán)境;2.ES模塊是異步加載,適用于瀏覽器等網(wǎng)絡(luò)環(huán)境;3.語法上,ES模塊使用import/export,且必須位于頂層作用域,而CommonJS使用require/module.exports,可在運(yùn)行時(shí)動(dòng)態(tài)調(diào)用;4.CommonJS廣泛用于舊版Node.js及依賴它的庫如Express,ES模塊則適用于現(xiàn)代前端框架和Node.jsv14 ;5.雖然可混合使用,但容易引發(fā)問題

如何在node.js中提出HTTP請(qǐng)求? 如何在node.js中提出HTTP請(qǐng)求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請(qǐng)求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場(chǎng)景,但需手動(dòng)處理數(shù)據(jù)拼接和錯(cuò)誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請(qǐng)求;2.axios是基于Promise的第三方庫,語法簡(jiǎn)潔且功能強(qiáng)大,支持async/await、自動(dòng)JSON轉(zhuǎn)換、攔截器等,推薦用于簡(jiǎn)化異步請(qǐng)求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基于Promise且語法簡(jiǎn)單

垃圾收集如何在JavaScript中起作用? 垃圾收集如何在JavaScript中起作用? Jul 04, 2025 am 12:42 AM

JavaScript的垃圾回收機(jī)制通過標(biāo)記-清除算法自動(dòng)管理內(nèi)存,以減少內(nèi)存泄漏風(fēng)險(xiǎn)。引擎從根對(duì)象出發(fā)遍歷并標(biāo)記活躍對(duì)象,未被標(biāo)記的則被視為垃圾并被清除。例如,當(dāng)對(duì)象不再被引用(如將變量設(shè)為null),它將在下一輪回收中被釋放。常見的內(nèi)存泄漏原因包括:①未清除的定時(shí)器或事件監(jiān)聽器;②閉包中對(duì)外部變量的引用;③全局變量持續(xù)持有大量數(shù)據(jù)。V8引擎通過分代回收、增量標(biāo)記、并行/并發(fā)回收等策略優(yōu)化回收效率,降低主線程阻塞時(shí)間。開發(fā)時(shí)應(yīng)避免不必要的全局引用、及時(shí)解除對(duì)象關(guān)聯(lián),以提升性能與穩(wěn)定性。

var vs Let vs const:快速JS綜述解釋器 var vs Let vs const:快速JS綜述解釋器 Jul 02, 2025 am 01:18 AM

var、let和const的區(qū)別在于作用域、提升和重復(fù)聲明。1.var是函數(shù)作用域,存在變量提升,允許重復(fù)聲明;2.let是塊級(jí)作用域,存在暫時(shí)性死區(qū),不允許重復(fù)聲明;3.const也是塊級(jí)作用域,必須立即賦值,不可重新賦值,但可修改引用類型的內(nèi)部值。優(yōu)先使用const,需改變變量時(shí)用let,避免使用var。

See all articles