Nodejs 第七十二章(fastify)
fastify
Fastify是一个web框架,高度专注于以最少的开销和强大的插件架构提供最佳的开发体验。它的灵感来自于Hapi和Express,它是运行在Node.js上的最快
的Web框架之一。
Fastify 可以被视为 Node.js 中的一个高效、现代化的 web 框架,是构建快速 web 应用的一个优秀选择。
fastify特点
-
高性能:据我们所知,Fastify 是最快的 web 框架之一,根据代码复杂度,我们可以处理每秒高达
40,000
个请求。 -
可扩展:Fastify 通过其钩子、插件和装饰器完全可扩展。
-
基于模式:虽然不是强制的,但我们建议使用 JSON Schema 来验证你的路由并序列化你的输出,内部的Fastify 将模式编译成一个高性能的函数。
-
日志记录:日志非常重要但成本高昂;我们选择了最佳的日志记录器 Pino 来几乎消除这一成本!
-
开发者友好:这个框架旨在非常表达性,并在不牺牲性能和安全性的情况下,帮助开发者日常使用。
-
TypeScript 准备就绪:我们努力维护 TypeScript 类型声明文件
Fastify和其他框架对比

应用场景
- 网关层
- Nest唯二框架之一
- 需要高性能的服务
- 以太坊
基本使用
基本跟express一样
import fastify from "fastify";
const server = fastify();
//post接口
server.post("/", async (request, reply) => {
const { name, version } = request.body;
//返回json 支持直接return
return {
name,
version
}
});
//get接口
server.get("/", async (request, reply) => {
reply.send(`${request.query.name}`);
});
server.listen({ port: 3000 }).then(() => console.log("server is running"))
路由
- method 定义请求方式 例如 get post put等
- url 匹配接口路径
- schema 含请求和响应模式的对象。它们需要采用
JSON 架构
格式
- body 验证post接口的参数
- querystring 验证地址栏上面的参数也就是get
- params 验证动态参数
- response 过滤并生成响应的模式,设置模式可以使我们的吞吐量提高 10-20%
- handler 请求处理函数
server.route({
method: "GET",
url: "/list",
schema: {
querystring: {
type: "object",
properties: {
page: { type: "number" },
pageNo: { type: "number" }
},
required: ["page", "pageNo"], //必填项
},
response: {
200: {
type: "object", //返回一个对象
properties: { //返回的数属性描述
data: { //返回data
type: "array", //是个数组类型
items: { //子集
type: "object", //是个对象
properties: { //子集的属性
name: { type: "string" },
version: { type: "string" }
}
}
}
}
}
}
},
handler: (request, reply) => {
request.query.page
return {
data: [{ name: "fastify", version: "4.27.0" }]
}
}
})
插件编写
与 JavaScript 一样,一切都是对象,在 Fastify 中一切都是插件
Fastify 允许用户通过插件扩展其功能。插件可以是一组路由、服务器装饰器或其他任何东西。您需要使用一个或多个插件的 API 是register
.
fastify.register(plugin, [options])
- app就是fastify实例
- options就是传递过来的传参数
- done控制流程 跟express next一样
server.register(function (app, opts, done) {
app.decorate(opts.name, (a, b) => a + b);
const res = app.add(1, 2)
console.log(res)
done()
},{
name:'add' //options
})
连接数据库
Fastify 的生态系统提供了一些用于连接各种数据库引擎的插件。
fastify.dev/ecosystem/ 大家需要用到什么插件都可以去生态去找
安装包
npm i @fastify/mysql
连接数据库
server.register(import('@fastify/mysql'),{
connectionString: 'mysql://root:123456@localhost:3306/xiaoman', //账号,密码,IP,端口,库名
})
实现一个简单的增加和查询
import fastify from "fastify";
const server = fastify({
logger: false,
});
server.register(import('@fastify/mysql'), {
connectionString: 'mysql://root:123456@localhost:3306/xiaoma',
})
//添加
server.post('/add',(request, reply) => {
server.mysql.query("insert into user(create_time,name,hobby) values(?,?,?)", [new Date(), request.body.name, request.body.hobby], (err, results) => {
if (err) {
console.log(err);
return reply.send(err);
}
reply.send({ results })
})
})
//查询
server.get('/list',(request, reply) => {
server.mysql.query("select * from user", (err, result) => {
reply.send({ result })
})
})
server.listen({ port: 3000 }).then(() => console.log("server is running"))
转载自:https://juejin.cn/post/7368820207576236042