如何将你的应用程序从Express迁移到Fastify

491 阅读5分钟

长期以来,Express一直是使用Node.js开发网络应用的最受欢迎的框架。不幸的是,这个框架在最近几年并没有看到什么积极的发展。这意味着它没有对现代JavaScript功能的支持。在此期间,出现了一些新的框架,它们采取了不同的方法来开发Node.js应用程序。其中一个框架是Fastify

在这篇文章中,我们将看看是什么让Fastify成为用Node.js开发Web应用的一个有吸引力的选择。我们将学习如何避免从头开始重写我们现有的Express应用程序,而是分阶段地将它们迁移到使用Fastify。当我们完成后,你将能够自信地迁移你现有的Express应用程序,并开始利用Fastify框架的优势。

跟随这篇文章,有几个要求。

  • 你需要对创建一个基本的Express应用程序、定义路由和配置中间件感到满意。
  • 你需要对在终端中运行命令感到满意。
  • 你需要安装Node.js>= v14.13.0。这为我们提供了对ECMAScript(ES)模块的良好支持,并允许我们使用顶级的等待。本文中的代码示例使用ES模块的语法(import /export)。

本文中所有的示例代码都可以在GitHub上找到,供你浏览、下载和实验。

从Express迁移到Fastify有什么好处?

如果你对用Express构建Node.js应用程序感到满意,你可能想知道将现有的Express应用程序迁移到Fastify的好处是什么。以下是考虑迁移的一些重要原因。

  • 验证和日志开箱即用。这些功能在构建Web应用程序时通常是必需的。当使用Fastify时,不需要为这些任务选择和集成库,因为它为我们提供了这些功能。我们将在本文后面进一步了解这些功能。

  • 对异步代码的本地支持。Fastify原生地处理承诺并支持async /await 。这意味着路由将为我们捕捉未捕获的拒绝承诺。这使得我们可以安全地编写异步代码。它还可以让我们做一些巧妙的事情,比如自动发送路由处理函数的返回值作为响应体。

    app.get("/user/:id", async (request) => await getUser(request.params.id));
    
  • JSON的自动解析和序列化。我们不需要配置Fastify来解析JSON请求体,或将对象序列化为响应的JSON。它为我们自动处理所有这些。

    app.get("/user/:id", async (request, reply) => {
      const name = request.body.name;
    
      reply.send({ user: { name } });
    });
    
  • 开发者友好。Fastify具有明确的和富有表现力的API,以及对TypeScript的出色支持,它的设计考虑到了开发者的经验。

  • 它是快速的。我们不希望一个框架成为我们应用程序中性能瓶颈的来源。好消息是,Fastify已经被构建为高性能的。Fastify的基准显示了它与其他Node.js网络框架的比较。

  • 正在积极开发中。Fastify框架正在积极开发中。它定期发布改进和错误/安全修复的版本

如何自信地迁移API

我们希望确信我们的应用程序在迁移到Fastify后仍能按预期工作。其中一个可以帮助我们捕捉到bug或识别非故意的变化的东西就是API集成测试。

集成测试以一种与单元测试不同的方式锻炼应用程序的组件。单元测试是对单个组件的功能进行单独测试。集成测试使我们能够验证多个组件一起工作的行为。

如果我们为Express应用程序编写API集成测试,我们希望在将应用程序迁移到Fastify后,能够运行这些相同的测试。当为API编写集成测试时,有几件关键的事情需要考虑。

  • 他们不应该被绑在一个特定的框架上。我们希望在迁移前后都能运行相同的测试,而不需要改变测试或我们使用的任何库。

  • 保持简单。至少,集成测试应该向API暴露的端点发出请求,并验证返回的响应,但一般不会多。我们可能想检查特定的HTTP状态代码或响应头,但我们应该尽量保持测试的简单。

  • 挑选你所熟悉的工具。有很多不同的工具可以帮助我们创建和运行API测试,但重要的是使用我们熟悉的工具。为了编写有效的集成测试,我们需要能够进行HTTP请求,并对API的响应进行断言。一般来说,我们不需要大量的库或工具来实现这一工作。

在这篇文章中,我们不会深入探讨如何实现API集成测试的细节,但在进行框架迁移之前,你应该考虑编写这些测试。

用fastify-express从Express过渡到Fastify

将现有的Express应用程序迁移到一个完全不同的框架,这个想法似乎相当令人畏惧。幸运的是,Fastify团队已经创建了一个插件--fastify-express,它可以帮助缓解迁移路径。

fastify-express 插件为Fastify增加了完全的Express兼容性。它提供了一个use() 方法,我们可以用它来向我们的Fastify服务器添加Express中间件和路由。这让我们可以选择将现有的Express应用程序的一部分逐渐迁移到Fastify上。

这里有一个Express路由器的例子。

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

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

export default router;

然后我们可以使用fastify-express ,将我们现有的Express路由器添加到Fastify服务器实例中。

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

当我们稍后开始将我们的应用程序迁移到Fastify时,我们将探索这一切是如何工作的细节。

需要注意的是,使用fastify-express 插件并不是一个长期的解决方案。如果我们想获得Fastify的全部好处,我们需要在某个时候迁移我们的Express特定的应用程序代码。然而,fastify-express 插件为我们提供了一个分阶段迁移到Fastify的机会。

继续阅读如何将你的应用程序从Express迁移到FastifyonSitePoint.