Nodejs 第七十二章(fastify)


theme: smartblue

fastify

Fastify是一个web框架,高度专注于以最少的开销和强大的插件架构提供最佳的开发体验。它的灵感来自于Hapi和Express,它是运行在Node.js上的最快的Web框架之一。

Fastify 可以被视为 Node.js 中的一个高效、现代化的 web 框架,是构建快速 web 应用的一个优秀选择。

fastify特点

  1. 高性能:据我们所知,Fastify 是最快的 web 框架之一,根据代码复杂度,我们可以处理每秒高达 40,000 个请求。

  2. 可扩展:Fastify 通过其钩子、插件和装饰器完全可扩展。

  3. 基于模式:虽然不是强制的,但我们建议使用 JSON Schema 来验证你的路由并序列化你的输出,内部的Fastify 将模式编译成一个高性能的函数。

  4. 日志记录:日志非常重要但成本高昂;我们选择了最佳的日志记录器 Pino 来几乎消除这一成本!

  5. 开发者友好:这个框架旨在非常表达性,并在不牺牲性能和安全性的情况下,帮助开发者日常使用。

  6. TypeScript 准备就绪:我们努力维护 TypeScript 类型声明文件

Fastify和其他框架对比

应用场景

  1. 网关层
  2. Nest唯二框架之一
  3. 需要高性能的服务
  4. 以太坊

基本使用

基本跟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”))

路由

  1. method 定义请求方式 例如 get post put等
  2. url 匹配接口路径
  3. schema 含请求和响应模式的对象。它们需要采用JSON 架构格式
  • body 验证post接口的参数
  • querystring 验证地址栏上面的参数也就是get
  • params 验证动态参数
  • response 过滤并生成响应的模式,设置模式可以使我们的吞吐量提高 10-20%
  1. 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])
  1. app就是fastify实例
  2. options就是传递过来的传参数
  3. 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 的生态系统提供了一些用于连接各种数据库引擎的插件。

https://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 下的原始话题分离的讨论话题