Fastify是用于后端Web开发的框架,具有强大的插件架构和最少的开销。它的主要灵感来自Hapi和Express,并且是运行在Node.js上的最快的Web框架之一。
Fastify v3.0是最新版本,自2020年7月上旬开始可用。v3.0具有一些特殊的新功能,例如:
- 在Fastify中运行Express应用程序
- 日志序列化中的更改
- 模式替换的更改
- 更好的TypeScript支持
Fastify功能概述
现在我们已经介绍了Fastify的最新版本更新功能,让我们来回顾一下Fastify最重要的功能。
-
高性能:根据代码的复杂程度,它可以为不太复杂的业务逻辑提供每秒约30,000个请求或更多的服务。
-
可扩展性:Hooks、插件和装饰器使其具有完全的可扩展性。
-
基于Scheme:在内部,Fastify将JSON模式编译成一个高性能的函数,可用于路由验证和输出序列化。
-
Logging:Pino是一种经济高效的记录器,可用于更快地记录日志
-
开发人员友好的环境:框架表现力强,容易上手。此外,它允许开发人员在不牺牲性能或安全性的情况下,将小型项目快速扩展到更大的高性能应用程序。
-
支持TypeScript:TypeScript类型声明文件维护了对TypeScript社区的支持
你应该知道的5个重要的Fastify插件
除了提供大量的功能外,它还有一个强大的插件架构。任何开发人员都可以构建与Fastify一起工作的插件,为API项目创建快速的构建块。
由外部开发人员开发的插件属于“社区插件”的范畴,而Fastify团队也维护着他们自己的一些插件,他们称之为“核心插件”。然而,重要的是要知道,任何社区插件都必须遵守Fastify的最佳实践。
使用核心插件的好处是,Fastify团队会积极维护这些插件,但请记住,社区插件可能不会被维护。
这里有一些重要的Fastify插件需要注意:
- fastify-auth:Fastify团队开发的身份验证插件,可让你快速向API路由注入身份验证逻辑。
- fastify-cors:跨源请求对任何应用程序都很重要,fastify-cors可以帮助你管理这些请求,而不需要单独安装CORS包。
- fastify-jwt:这个插件将用标准的JSON web token来装饰你的应用程序。Fastify-jwt内部使用jsonwebtoken包。
- fastify-nextjs:Next是一个React框架,用于在服务器端构建预渲染网站。这个插件可以帮助你用Fastify做同样的事情。
- fastify-redis:这使你的Fastify应用程序能够在整个服务器上共享同一个Redis连接。
而这还不是一个全面的列表,Fastify有一个广泛的插件选择。
Fastify vs Koa vs Express
当然,每个框架都有其优点和缺点——但每个框架也有其应用场景。要比较不同的框架并不容易,然而,我试图选择相关的评估标准供你在选择框架时参考。
速度比较
下面是StackShare.io对速度对比的概述。
-
Express:Express处理的请求量最少/秒。基准证明,Express可以处理15978个请求/秒。
-
Koa:Koa是比Express更好的选择。它也是一个轻量级框架,可以处理54,848个请求/秒。
-
Fastify:Fastify获得了最佳的基准结果,78,956次/秒的请求量。
插件生态系统
正如上一节所讨论的,Fastify是这三个框架中唯一一个拥有多种插件的Web框架,而且它有很大的不同。这对开发者来说是一个很大的好处,因为他们不必依赖多个框架或包来构建他们的应用程序。Fastify成为一站式的解决方案。
TypeScript支持
同样,Fastify是唯一一个开箱即支持TypeScript的框架。根据你的Node.js版本,你可能需要安装 @types/node
。
使用Fastify 3.0创建你的第一个服务器
现在,激动人心的部分来了!本教程将指导你如何使用Fastify建立你的第一个服务器,包括以下几个方面:
- 安装
- 运行你的第一台服务器
- 添加路由到你的API
- 使用Fastify插件
- 增加数据验证功能
准备好了吗?让我们开始。
1.安装及要求
首先,使用以下命令启动一个新的npm项目:
npm init -y
接下来,让我们将Fastify依赖项添加到你的项目中。
npm i fastify --save
// OR
yarn add fastify
确保在系统上安装了最新的Node.js版本。你可以使用nvm(Node版本管理器)来快速切换不同的Node.js版本。你还需要一个工具来发送请求,比如cURL或Postman。
2.创建server.js
接下来,让我们在项目的根目录下创建一个名为 server.js
的新文件。在你的 server.js
文件中添加以下代码。
const fastify = require('fastify')({ logger: true })
// 在此处添加路由,将在后续步骤中进行讨论
//@Server
fastify.listen(5000, (err) => {
if (err) {
console.log(err)
process.exit(1)
} else {
console.log(`Server running, navigate to https://localhost:5000`)
}
})
如你所见,监听函数在端口 5000
上启动服务器。它还接受一个回调,该回调接受一个参数,该参数可以包含一个错误对象。这是运行Fastify API的最基本的服务器设置。
如果要尝试此基本设置,可以使用 node
命令运行 server.js
文件,如下所示:
node server.js
这将在地址http://localhost:5000上启动服务器。如果你尝试导航到这个地址,你会看到一个错误,这个路由不存在,因为我们还没有定义任何路由。现在我们需要添加一些简单的CRUD路由。
3.添加CRUD路由
让我们向应用程序中添加一些基本的CRUD路由。首先,让我们添加一个GET路由。
3.1 GET路由
假设我们有一个数组类型的 stack对象。首先,我们想要添加一个GET路由来检索这个数组的内容。要做到这一点,我们可以使用Fastify对象来定义一个 get
路由。第一个参数接受我们要附加路由的路径,第二个参数接受回调,回调会给你的客户端发送回复。
const stack = []
//@Routes
fastify.get('/getStack', (request, reply) => {
reply.send(stack)
})
3.2 POST路由
接下来,让我们尝试使用POST路由向我们的stack数组添加项目。这样一来,我们就可以通过请求来发送数据。在这里,我们希望用户发送带有一个名为 item
的参数的JSON对象。我们把这个项目push到我们的stack数组中。现在我们可以使用回调 request
的第一个参数,它包含了POST请求发送的数据。
fastify.post('/addItem', (request, reply) => {
const item = request.body.item
stack.push(item)
reply.send(stack)
})
同样的原则也适用于其他路由方法,如PUT、DELETE、HEAD、PATCH和OPTIONS。关于路由选项的更多信息可以在Fastify文档中找到。
3.3 最终路由代码
你的最终路由代码应如下所示:
const fastify = require('fastify')({ logger: true })
const stack = []
//@Routes
fastify.get('/getStack', (request, reply) => {
reply.send(stack)
})
fastify.post('/addItem', (request, reply) => {
const item = request.body.item
stack.push(item)
reply.send(stack)
})
//@Server
fastify.listen(5000, (err) => {
if (err) {
console.log(err)
process.exit(1)
} else {
console.log(`Server running, navigate to https://localhost:5000`)
}
})
现在让我们试试我们创建的代码。首先,用 node server.js
启动服务器。接下来,访问下面的路由http://localhost:5000/getStack,它应该返回一个空数组对象。
让我们使用cURL向stack中添加一个项目。我想在stack中添加一个 apple
。因此,我发送了一个包含key item和value apple的JSON对象。
curl --header "Content-Type: application/json" --request POST --data '{"item": "apple"}' http://localhost:5000/addItem
如果你再次访问http://localhost:5000/getStack,你会发现stack数组中已经填充了 apple
项目。
都好吗?那就加个插件吧!
4.将插件添加到Fastify API
为了演示添加和使用Fastify插件是多么简单,让我们安装fastify-routes,它使我们能够检索所有注册的Fastify实例的路由地图。
首先,从CLI安装Fastify-routes依赖项:
npm i fastify-routes
安装插件后,请在注册任何路由之前通过包含插件来注册插件。
这是 server.js
文件的一个片段,其中包含 fastify-routes
插件。我还添加了 console.log
语句,该语句显示了如何使用该插件返回所有已注册的路由。
const fastify = require('fastify')({ logger: true })
fastify.register(require('fastify-routes')) // Add and register plugin
const stack = []
//@Routes
fastify.get('/getStack', (request, reply) => {
reply.send(stack)
})
fastify.post('/addItem', (request, reply) => {
const item = request.body.item
stack.push(item)
reply.send(stack)
})
//@Server
fastify.listen(5000, (err) => {
console.log(fastify.routes) // Log all registered routes
if (err) {
console.log(err)
process.exit(1)
} else {
console.log(`Server running, navigate to https://localhost:5000`)
}
})
现在,当你使用 node server.js
启动服务器时,CLI将打印所有已注册的路由。组成你的服务器的 fastify
对象也作为所有注册插件的父对象,你可以直接从这个 fastify
对象中调用它们。
最后,让我们在服务器上添加一些基本的数据验证。
5.添加数据验证
作为本教程的最后一个元素,我们将数据验证添加到你的路由中。具体来说,我们要为我们之前创建的POST路由添加验证。让我们验证一下body对象是否包含 item
属性,数据类型是否应该匹配字符串类型。
幸运的是,Fastify允许我们为路由定义验证模式。下面是一个验证 item
属性是否存在并包含字符串的例子。此外,我们使用 extraitionalProperties: false
设置告诉Fastify服务器,我们不允许在body对象上有任何附加属性。
你还可以定义一个response属性,该属性描述请求成功时的响应。
这是添加数据验证选项后的完整代码。不要忘了将 itemValidation
添加为POST路由的第二个参数。
const fastify = require('fastify')({ logger: true })
fastify.register(require('fastify-routes'))
const itemValidation = { // Define validation
schema: {
body: {
type: 'object',
additionalProperties: false,
required: [
'item'
],
properties: {
item: { type: 'string' }
}
},
response: {
201: {
type: 'object',
properties: {
item: { type: 'string' }
}
}
}
}
}
const stack = []
//@Routes
fastify.get('/getStack', (request, reply) => {
reply.send(stack)
})
fastify.post('/addItem', itemValidation, (request, reply) => { // Add validation options to POST route
const item = request.body.item
stack.push(item)
reply.send(stack)
})
//@Server
fastify.listen(5000, (err) => {
console.log(fastify.routes)
if (err) {
console.log(err)
process.exit(1)
} else {
console.log(`Server running, navigate to https://localhost:5000`)
}
})
让我们通过将相同的请求发送到我们的服务器,再添加 apple
项目,再次尝试代码。该请求应成功执行。
curl --header "Content-Type: application/json" --request POST --data '{"item": "apple"}' http://localhost:5000/addItem
接下来,让我们尝试发送一个包含空对象的项目,以便我们可以测试服务器是否拒绝了该请求。向你的服务器发送以下请求,以验证数据验证的实现。
curl --header "Content-Type: application/json" --request POST --data '{"item": {}}' http://localhost:5000/addItem
服务器应向你发送以下错误消息:
{"statusCode":400,"error":"Bad Request","message":"body.item should be string"}
都好吗?恭喜你!你已经成功完成了第一台Fastify API服务器。
结束
我希望你喜欢使用Fastify构建一个简单的CRUD API,同时实现数据验证和添加插件。
还有更多的插件存在,所以一定要查看Fastify插件生态系统,看看有哪些可用的插件。插件对于快速引导你的API很有用,无需从头开始构建API。
随时查看Fastify提供的以下概念:
- 数据序列化
- 如何在服务器上使用HTTP2
- 添加hooks以监听服务器中的特定事件
- 需要自定义中间件吗?只需添加它!
就是这样,伙计们!完整的代码可以在我的GitHub仓库中找到。
最后
最近整理了一份优质视频教程资源,想要的可以关注我公众号:前端全栈开发者,即可免费领取哦!如果文章对你有所启发和帮助,可以点个关注、收藏、转发,也可以留言讨论,这是对作者的最大鼓励。