Fastify系列-从0到1超详细手把手教你使用Fastify构建快速的API

news2024/12/20 9:14:07

什么是Fastify?

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

为什么使用Fastify?

这些是fasttify的主要特性和原则

  • 高性能:据我们所知,Fastify是目前最快的web框架之一,根据代码的复杂程度,我们可以每秒处理多达3万个请求。

  • 可扩展:通过钩子、插件和装饰器,fasttify是完全可扩展的。

  • 基于模式:即使不是强制性的,我们也建议使用JSON模式来验证你的路由和序列化你的输出,在内部fasttify会在一个高性能的函数中编译模式。

  • 日志记录:日志非常重要,但成本很高;它拥有最好的日志记录器,不用我们自己手动添加。

  • 对开发人员友好:该框架非常具有表现力,可以在不牺牲性能和安全性的情况下帮助开发人员进行日常使用。

  • TypeScript:支持不断增长的TypeScript

快速上手

  • 官方文档

安装并运行第一个服务

首先,使用命令创建新的Fastify项目

npm i fastify

创建server

在项目根目录下创建 app.js 文件

// CommonJs
const fastify = require('fastify')({
  logger: true
})

// Declare a route
fastify.get('/', function (request, reply) {
  reply.send({ hello: 'world' })
})

// Run the server!
fastify.listen({ port: 8081 }, function (err, address) {
  if (err) {
    fastify.log.error(err)
    process.exit(1)
  }
  console.log(`Server is now listening on ${address}`)
})

代码表示,监听端口 8081 启动服务器

启动服务

使用 node 命令运行 app.js 文件,如下所示:

node app.js

测试服务

我们使用浏览器打开http://127.0.0.1:8081/

好了,到此我们已经初步了解了Fastify的基础服务如何搭建与运行,接下来我们进入详细的使用介绍

详细使用

使用async/await

你更喜欢使用async/await吗? Fastify支持开箱即用。

// ESM
import Fastify from 'fastify'
const fastify = Fastify({
  logger: true
})
// CommonJs
const fastify = require('fastify')({
  logger: true
})

fastify.get('/', async (request, reply) => {
  return { hello: 'world' }
})

/**
 * Run the server!
 */
const start = async () => {
  try {
    await fastify.listen({ port: 3000 })
  } catch (err) {
    fastify.log.error(err)
    process.exit(1)
  }
}
start()

开始我们的第一个插件-路由

  • 在JavaScript中一切都是对象,而在fasttify中一切都是插件。
  • 我们接下来要声明一个路由文件,我们需要把它单独抽离出来,放在入口的外面。
  • 查看路由声明文档:https://www.fastify.cn/docs/latest/Reference/Routes/

创建路由文件

在根目录下创建 route.js

/**
 * Encapsulates the routes
 * @param {FastifyInstance} fastify  Encapsulated Fastify Instance
 * @param {Object} options plugin options, refer to https://www.fastify.io/docs/latest/Reference/Plugins/#plugin-options
 */
async function routes (fastify, options) {
    fastify.get('/', async (request, reply) => {
      return { hello: 'world' }
    })
  }
  
  module.exports = routes

注册路由文件

修改app.js

// fastify.get('/', async (request, reply) => {
//   return { hello: 'world' }
// })

改为

fastify.register(require('./route'))

启动、测试服务

使用 node 命令运行

node app.js


我们使用浏览器打开http://127.0.0.1:8081/

至此,我们的路由已经创建完毕,是不是很简单呢?大家可以观察到,Fasttify提供了async await 来实现接口调用,这一点十分重要,因为当我们链接数据库的时候,需要保证数据库是可用状态后才可以去读取数据,这个时候就需要用到async了,接下来我们一起来试试吧

数据库连接

我们以postgres数据库为例

前置条件

我们需要一个db url 创建好的db数据库可以用来使用哦~~

安装依赖

npm i fastify-plugin 
npm i pg @fastify/postgres

相关文档
https://www.npmjs.com/package/@fastify/postgres
https://www.fastify.cn/docs/latest/Guides/Getting-Started/

编写插件

根目录下创建postgres-connector.js

/**
 * @type {import('fastify-plugin').FastifyPlugin}
 */
const fastifyPlugin = require('fastify-plugin')


/**
 * Connects to a postgres database
 * @param {FastifyInstance} fastify Encapsulated Fastify Instance
 * @param {Object} options plugin options, refer to https://www.fastify.io/docs/latest/Reference/Plugins/#plugin-options
 */
async function dbConnector (fastify, options) {
  fastify.register(require('@fastify/postgres'), {
    connectionString: 'postgresql://名字:密码@数据库服务器名:端口号/数据库名'
  })
}

// Wrapping a plugin function with fastify-plugin exposes the decorators
// and hooks, declared inside the plugin to the parent scope.
module.exports = fastifyPlugin(dbConnector)

注册插件

打开app.js 注册我们写的插件

fastify.register(require('./postgres-connector'))

添加测试接口

打开route.js,添加测试接口代码

/**
 * Encapsulates the routes
 * @param {FastifyInstance} fastify  Encapsulated Fastify Instance
 * @param {Object} options plugin options, refer to https://www.fastify.io/docs/latest/Reference/Plugins/#plugin-options
 */
async function routes(fastify, options) {
  fastify.get("/", async (request, reply) => {
    return { hello: "world" };
  });
  fastify.get("/test", async (req, reply) => {
    const client = await fastify.pg.connect();
    try {
      const { rows } = await client.query("SELECT id, name FROM tests");
      // Note: avoid doing expensive computation here, this will block releasing the client
      return rows;
    } finally {
      // Release the client immediately after query resolves, or upon error
      client.release();
    }
  });
}

module.exports = routes;

启动服务测试

node app.js

成功获取数据库信息

总结

  • 如上图所见,我们对数据库连接器和路由的注册都使用了register。

  • 这是Fastify最好的特性之一,它会按照你声明插件的顺序加载插件,并且只在当前插件被加载后才会加载下一个插件。

  • 通过这种方式,我们可以在第一个插件中注册数据库连接器,并在第二个插件中使用它

  • 请阅读此处以了解如何处理插件的作用域:https://www.fastify.cn/docs/latest/Reference/Plugins/#handle-the-scope

  • 当你调用fastify.listen()、fastify.inject()或fastify时,插件加载开始。

  • postgres插件使用装饰API将自定义对象添加到fasttify实例,官方文档鼓励使用这种api来简化代码重用并减少代码或逻辑重复。

  • 要深入了解fasttify插件是如何工作的,如何开发新的插件,以及如何使用整个fasttify API来处理异步启动应用程序的复杂性的细节,请阅读插件指南

  • 今天就写到这里啦~

  • 小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~

  • 大家要天天开心哦

欢迎大家指出文章需要改正之处~
学无止境,合作共赢

在这里插入图片描述

欢迎路过的小哥哥小姐姐们提出更好的意见哇~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/788858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL--实现数据库备份恢复详细教学

前言 这是我在这个网站整理的笔记,关注我,接下来还会持续更新。 作者:RodmaChen PostgreSQL--实现数据库备份恢复详细教学 一. 数据库备份二. 数据库恢复三. 存留问题 数据库备份恢复功能是每个产品所需的,以下是简单的脚本案例&a…

遇到了一个存在XSS(存储型)漏洞的网站

第一个漏洞self xss(存储型) 存在漏洞的网站是https://www.kuangstudy.com/ 然后点击个人设置 在编辑主页中,我们可以用最简单的script语句进行注入,提交; 出现弹窗,说明它已经把代码进行解析&#x…

【设计模式学习1】什么是单例模式?单例模式的几种实现。

一、什么是单例模式 单例模式是在内存中只创建一个对象的模式,它保证一个类只有一个实例。 二、单例模式的几种实现 (一)懒汉式单例模式 /*** 懒汉式单例模式* (懒加载,需要的时候在去加载)* 优点&…

递归——另类加法、走方格的方案数

大家好,这里是bang_bang,今天来记录2道递归的典型题目 目录 1.另类加法 2.走方格的方案数 1.另类加法 另类加法__牛客网 (nowcoder.com) 给定两个int A和B。编写一个函数返回AB的值,但不得使用或其他算数运算符。 测试样例:…

【Linux】system V IPC原理分析

目录 System V IPC分类 key_t 键和ftok函数 ipc_perm结构 创建和打开IPC通道 IPC权限问题 理解IPC工作原理 System V IPC分类 System V 消息队列System V 共享内存System V 信号量 之所以称为System V IPC是因为这三种IPC机制都是来源于System V Unix的实现。 消息队列信…

一款好用的思维导图软件drawio

最近需要画思维导图,结果发现既然被人用来收费了。所以记录一下,免得大家上当。 首先说明,这个东东在github上是免费开源的,收费的是一些不法分子搞得。下面是收费版本得界面。 开源地址: https://github.com/jgraph…

坑爹的shadow -- 总结 与 各种坑

作者:snwrking 最近公司来了新UX总监, 很喜欢给设计添加浓重的, 而且是好几层的阴影. 这下就苦了我们Android开发了. 因为是Android不支持啊, 巧妇也难为无米之炊啊. (折中方法也不是没有, 就是自己把阴影做个view, 但它的blur这些比较麻烦, 做过Android的都知道这个…

DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

1.手动实现登录框&#xff1b; ---mychat.h---头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> //打印信息 #include <QIcon> //图标 #include <QPushButton> //按钮 #include <QLineEdit> //行编辑器类 #in…

ERC20 allowance,approve 和 transferFrom

allowance&#xff0c;approve 和 transferFrom&#xff0c;这几个函数提供了一些高级功能&#xff0c;用于授权其他以太坊地址的所有者(spender)代表你使用你的token。这个“其他以太坊地址”可能是一个智能合约&#xff0c;也可能只是一个普通token账户。 ● approve函数。T…

output delay 约束

output delay 约束 一、output delay约束概述二、output delay约束系统同步三、output delay约束源同步 一、output delay约束概述 特别注意&#xff1a;在源同步接口中&#xff0c;定义接口约束之前&#xff0c;需要用create_generated_clock 先定义送出的随路时钟。 二、out…

labview 多线程同步

所谓通讯的同步是指多个线程同时进行或严格按照顺序执行&#xff0c;数据的严格性是指发送多少数据接收多少数据&#xff0c;不能出现数据丢失或重复接收的现象。 labview的同步机制有事件发生、集合点、通知器、信号量。 可以这么来记忆&#xff1a;事急&#xff08;集&…

kotlin高阶函数

kotlin高阶函数 函数式API:一个函数的入参数为Lambda表达式的函数就是函数式api 例子: public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {return filterTo(ArrayList<T>(), predicate) }上面这段函数: 首先这个函…

Nginx配置server_name讲解

文章目录 1.Nginx配置中没有server_name会怎样&#xff1f;2.Nginx配置server_name的匹配规则3.正则表达式规则 1.Nginx配置中没有server_name会怎样&#xff1f; 此时Nginx会自动设置成 server_name ""; 它不会匹配任何域名&#xff0c;导致Nginx会优先将HTTP请求交…

2023年7月第3周大模型荟萃

2023年7月第3周大模型荟萃 2023.7.25版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、华为发布大模型时代 AI 存储新品 7 月 14 日华为在深圳发布了大模型时代 AI 存储新品&#xff0c;为基础模型训练、行业模型训练&#xff0c;细分场…

连锁反应开始了!Linux 发行版迎新变化!

任何企业都有合法权利捍卫其模型和产品。撇开大量不真正了解开源许可证如何工作的人不谈&#xff0c;我们的印象是&#xff0c;有很多人觉得仅仅因为这是Linux&#xff0c;他们就有某种权利免费获得它。但事实上&#xff0c;他们没有。这不是自由软件中的“自由”的意思&#x…

【VCS】(5)Fast RTL-level Verification

Fast RTL-level Verification General Coding GuidlinesLab --- simprofile$display() 输出彩色内容 前面的内容都是在说怎样进行仿真和验证&#xff0c;即如何使用 VCS 。 但是&#xff0c;仿真和验证是不是也有所讲究&#xff1f; 有没有一些标准来衡量设计代码和验证代码的质…

面向初学者的APP开发教程:开始你的编程之旅

不管你是已经在 APP开发行业中工作了很长时间&#xff0c;还是正在学习该领域的知识&#xff0c;都有必要开始学习如何编写一个应用程序。对于初学者来说&#xff0c;编写应用程序的第一步是使用 HTML和 CSS构建一个漂亮的UI。 一旦你学会了这些基本技能&#xff0c;你就可以开…

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…

【Milvus】记录一次基于milvus-backup做的Milvus备份与恢复

文章目录 环境代码准备备份构建/运行验证 恢复遇到的问题 环境 milvus&#xff1a;v2.2.4 go&#xff1a;1.20.2 darwin/amd64 milvus-backup&#xff1a;v0.2.2 代码准备 https://github.com/zilliztech/milvus-backup/releases 如果你的milvus是2.2.9版本及以上&#xf…

SAP CAP篇十一:支持Media Object:图片、附件等

文章目录 本系列此前的文章官方文档详细修改更新数据库修改Annotation使其显示在Object Page上 运行结果Fiori Object Page上的Attachment Facet选择完文件后的UI效果前台与后台的交互 对应代码及branch 本系列此前的文章 SAP CAP篇一: 快速创建一个Service&#xff0c;基于Ja…