Skip to main content

V5 迁移指南

¥V5 Migration Guide

本指南旨在帮助从 Fastify v4 迁移到 v5。

¥This guide is intended to help with migration from Fastify v4 to v5.

在迁移到 v5 之前,请确保你已修复 v4 中的所有弃用警告。所有 v4 弃用都已删除,升级后将不再起作用。

¥Before migrating to v5, please ensure that you have fixed all deprecation warnings from v4. All v4 deprecations have been removed and will no longer work after upgrading.

长期支持周期

¥Long Term Support Cycle

Fastify v5 仅支持 Node.js v20+。如果你使用的是旧版本的 Node.js,则需要升级到较新版本才能使用 Fastify v5。

¥Fastify v5 will only support Node.js v20+. If you are using an older version of Node.js, you will need to upgrade to a newer version to use Fastify v5.

Fastify v4 仍受支持至 2025 年 6 月 30 日。如果你无法升级,你应该考虑从 HeroDevs 购买终止支持计划。

¥Fastify v4 is still supported until June 30, 2025. If you are unable to upgrade, you should consider buying an end-of-life support plan from HeroDevs.

为什么是 Node.js v20?

¥Why Node.js v20?

Fastify v5 将仅支持 Node.js v20+,因为它与 v18 相比有显著差异,例如对 node:test 的更好支持。这使我们能够提供更好的开发者体验并简化维护。

¥Fastify v5 will only support Node.js v20+ because it has significant differences compared to v18, such as better support for node:test. This allows us to provide a better developer experience and streamline maintenance.

Node.js v18 将于 2025 年 4 月 30 日退出长期支持,因此你无论如何都应该计划升级到 v20。

¥Node.js v18 will exit Long Term Support on April 30, 2025, so you should be planning to upgrade to v20 anyway.

重大变更

¥Breaking Changes

现在需要完整的 JSON 模式来处理 querystringparamsbody 以及响应模式

¥Full JSON Schema is now required for querystring, params and body and response schemas

从 v5 开始,Fastify 将需要完整的 JSON 模式来满足 querystringparamsbody 模式的要求。请注意,jsonShortHand 选项也已被删除。

¥Starting with v5, Fastify will require a full JSON schema for the querystring, params and body schema. Note that the jsonShortHand option has been removed as well.

如果使用默认的 JSON 模式验证器,则需要为 querystringparamsbodyresponse 模式提供完整的 JSON 模式,包括 type 属性。

¥If the default JSON Schema validator is used, you will need to provide a full JSON schema for the querystring, params, body, and response schemas, including the type property.

// v4
fastify.get('/route', {
schema: {
querystring: {
name: { type: 'string' }
}
}
}, (req, reply) => {
reply.send({ hello: req.query.name });
});
// v5
fastify.get('/route', {
schema: {
querystring: {
type: 'object',
properties: {
name: { type: 'string' }
},
required: ['name']
}
}
}, (req, reply) => {
reply.send({ hello: req.query.name });
});

有关更多详细信息,请参阅 #5586

¥See #5586 for more details

请注意,仍然可以覆盖 JSON Schema 验证器以使用不同的格式,例如 Zod。此更改也简化了这一点。

¥Note that it's still possible to override the JSON Schema validator to use a different format, such as Zod. This change simplifies that as well.

此更改有助于集成其他工具,例如 @fastify/swagger

¥This change helps with integration of other tools, such as @fastify/swagger.

新的日志器构造函数签名

¥New logger constructor signature

在 Fastify v4 中,Fastify 接受了在 logger 选项中构建 pino 日志器的选项,以及自定义日志器实例。这是造成严重混乱的根源。

¥In Fastify v4, Fastify accepted the options to build a pino logger in the logger option, as well as a custom logger instance. This was the source of significant confusion.

因此,logger 选项在 v5 中将不再接受自定义日志器。要使用自定义日志器,你应该改用 loggerInstance 选项:

¥As a result, the logger option will not accept a custom logger anymore in v5. To use a custom logger, you should use the loggerInstance option instead:

// v4
const logger = require('pino')();
const fastify = require('fastify')({
logger
});
// v5
const loggerInstance = require('pino')();
const fastify = require('fastify')({
loggerInstance
});

useSemicolonDelimiter 默认为 false

¥useSemicolonDelimiter false by default

从 v5 开始,Fastify 实例将不再默认支持在查询字符串中使用分号分隔符,就像在 v4 中一样。这是因为它是非标准行为并且不遵守 RFC 3986

¥Starting with v5, Fastify instances will no longer default to supporting the use of semicolon delimiters in the query string as they did in v4. This is due to it being non-standard behavior and not adhering to RFC 3986.

如果你仍希望使用分号作为分隔符,则可以通过在服务器配置中设置 useSemicolonDelimiter: true 来实现。

¥If you still wish to use semicolons as delimiters, you can do so by setting useSemicolonDelimiter: true in the server configuration.

const fastify = require('fastify')({
useSemicolonDelimiter: true
});

参数对象不再具有原型

¥The parameters object no longer has a prototype

在 v4 中,parameters 对象有一个原型。这在 v5 中不再是这种情况。这意味着你无法再访问 parameters 对象上从 Object 继承的属性,例如 toStringhasOwnProperty

¥In v4, the parameters object had a prototype. This is no longer the case in v5. This means that you can no longer access properties inherited from Object on the parameters object, such as toString or hasOwnProperty.

// v4
fastify.get('/route/:name', (req, reply) => {
console.log(req.params.hasOwnProperty('name')); // true
return { hello: req.params.name };
});
// v5
fastify.get('/route/:name', (req, reply) => {
console.log(Object.hasOwn(req.params, 'name')); // true
return { hello: req.params.name };
});

通过加强对原型污染攻击的防御,这提高了应用的安全性。

¥This increases the security of the application by hardening against prototype pollution attacks.

类型提供程序现在区分验证器和序列化器模式

¥Type Providers now differentiate between validator and serializer schemas

在 v4 中,类型提供程序对于验证和序列化具有相同的类型。在 v5 中,类型提供程序已分为两种不同的类型:ValidatorSchemaSerializerSchema

¥In v4, the type providers had the same types for both validation and serialization. In v5, the type providers have been split into two separate types: ValidatorSchema and SerializerSchema.

@fastify/type-provider-json-schema-to-ts@fastify/type-provider-typebox 已更新:升级到最新版本以获取新类型。如果你使用的是自定义类型提供程序,则需要按如下方式进行修改:

¥@fastify/type-provider-json-schema-to-ts and @fastify/type-provider-typebox have already been updated: upgrade to the latest version to get the new types. If you are using a custom type provider, you will need to modify it like the following:

--- a/index.ts
+++ b/index.ts
@@ -11,7 +11,8 @@ import {
import { FromSchema, FromSchemaDefaultOptions, FromSchemaOptions, JSONSchema } from 'json-schema-to-ts'

export interface JsonSchemaToTsProvider<
Options extends FromSchemaOptions = FromSchemaDefaultOptions
> extends FastifyTypeProvider {
- output: this['input'] extends JSONSchema ? FromSchema<this['input'], Options> : unknown;
+ validator: this['schema'] extends JSONSchema ? FromSchema<this['schema'], Options> : unknown;
+ serializer: this['schema'] extends JSONSchema ? FromSchema<this['schema'], Options> : unknown;
}

.listen() 方法的更改

¥Changes to the .listen() method

.listen() 方法的可变参数签名已被删除。这意味着你无法再使用可变数量的参数调用 .listen()

¥The variadic argument signature of the .listen() method has been removed. This means that you can no longer call .listen() with a variable number of arguments.

// v4
fastify.listen(8000)

将成为:

¥Will become:

// v5
fastify.listen({ port: 8000 })

这在 v4 中已弃用为 FSTDEP011,因此你应该已经更新了代码以使用新签名。

¥This was already deprecated in v4 as FSTDEP011, so you should have already updated your code to use the new signature.

已删除直接返回尾部

¥Direct return of trailers has been removed

在 v4 中,你可以直接从处理程序返回尾部。这在 v5 中不再可能。

¥In v4, you could directly return trailers from a handler. This is no longer possible in v5.

// v4
fastify.get('/route', (req, reply) => {
reply.trailer('ETag', function (reply, payload) {
return 'custom-etag'
})
reply.send('')
});
// v5
fastify.get('/route', (req, reply) => {
reply.trailer('ETag', async function (reply, payload) {
return 'custom-etag'
})
reply.send('')
});

也可以使用回调。这在 v4 中已弃用为 FSTDEP013,因此你应该已经更新了代码以使用新签名。

¥A callback could also be used. This was already deprecated in v4 as FSTDEP013, so you should have already updated your code to use the new signature.

简化对路由定义的访问

¥Streamlined access to route definition

与访问路由定义相关的所有弃用属性都已被删除,现在可通过 request.routeOptions 访问。

¥All deprecated properties relating to accessing the route definition have been removed and are now accessed via request.routeOptions.

代码描述怎么解决讨论
FSTDEP012你正在尝试访问已弃用的 request.context 属性。使用 request.routeOptions.configrequest.routeOptions.schema#4216 #5084
FSTDEP015你正在访问已弃用的 request.routeSchema 属性。使用 request.routeOptions.schema#4470
FSTDEP016你正在访问已弃用的 request.routeConfig 属性。使用 request.routeOptions.config#4470
FSTDEP017你正在访问已弃用的 request.routerPath 属性。使用 request.routeOptions.url#4470
FSTDEP018你正在访问已弃用的 request.routerMethod 属性。使用 request.routeOptions.method#4470
FSTDEP019你正在访问已弃用的 reply.context 属性。使用 reply.routeOptions.configreply.routeOptions.schema#5032 #5084

有关更多信息,请参阅 #5616

¥See #5616 for more information.

reply.redirect() 有新的签名

¥reply.redirect() has a new signature

reply.redirect() 方法有一个新的签名:reply.redirect(url: string, code?: number)

¥The reply.redirect() method has a new signature: reply.redirect(url: string, code?: number).

// v4
reply.redirect(301, '/new-route')

将其更改为:

¥Change it to:

// v5
reply.redirect('/new-route', 301)

这在 v4 中已弃用为 FSTDEP021,因此你应该已经更新了代码以使用新签名。

¥This was already deprecated in v4 as FSTDEP021, so you should have already updated your code to use the new signature.

现在禁止修改 reply.sent

¥Modifying reply.sent is now forbidden

在 v4 中,你可以修改 reply.sent 属性以防止发送响应。这在 v5 中不再可能,请改用 reply.hijack()

¥In v4, you could modify the reply.sent property to prevent the response from being sent. This is no longer possible in v5, use reply.hijack() instead.

// v4
fastify.get('/route', (req, reply) => {
reply.sent = true;
reply.raw.end('hello');
});

将其更改为:

¥Change it to:

// v5
fastify.get('/route', (req, reply) => {
reply.hijack();
reply.raw.end('hello');
});

这在 v4 中已弃用为 FSTDEP010,因此你应该已经更新了代码以使用新签名。

¥This was already deprecated in v4 as FSTDEP010, so you should have already updated your code to use the new signature.

路由版本签名更改的约束

¥Constraints for route versioning signature changes

我们更改了路由版本控制约束的签名。versionversioning 选项已被删除,你应该改用 constraints 选项。

¥We changed the signature for route versioning constraints. The version and versioning options have been removed and you should use the constraints option instead.

代码描述怎么解决讨论
FSTDEP008你正在通过路由 {version: "..."} 选项使用路由约束。使用 {constraints: {version: "..."}} 选项。#2682
FSTDEP009你正在通过服务器 {versioning: "..."} 选项使用自定义路由版本控制策略。使用 {constraints: {version: "..."}} 选项。#2682

HEAD 路由需要在 exposeHeadRoutes: true 时在 GET 之前注册

¥HEAD routes requires to register before GET when exposeHeadRoutes: true

exposeHeadRoutes: true 时,我们对自定义 HEAD 路由有更严格的要求。

¥We have a more strict requirement for custom HEAD route when exposeHeadRoutes: true.

当你提供自定义 HEAD 路由时,你必须明确将 exposeHeadRoutes 设置为 false

¥When you provides a custom HEAD route, you must either explicitly set exposeHeadRoutes to false

// v4
fastify.get('/route', {

}, (req, reply) => {
reply.send({ hello: 'world' });
});

fastify.head('/route', (req, reply) => {
// ...
});
// v5
fastify.get('/route', {
exposeHeadRoutes: false
}, (req, reply) => {
reply.send({ hello: 'world' });
});

fastify.head('/route', (req, reply) => {
// ...
});

或者将 HEAD 路由放在 GET 之前。

¥or place the HEAD route before GET.

// v5
fastify.head('/route', (req, reply) => {
// ...
});

fastify.get('/route', {

}, (req, reply) => {
reply.send({ hello: 'world' });
});

这在 #2700 中已更改,旧行为在 v4 中已弃用为 FSTDEP007

¥This was changed in #2700, and the old behavior was deprecated in v4 as FSTDEP007.

删除 request.connection

¥Removed request.connection

request.connection 属性已在 v5 中删除。你应该改用 request.socket

¥The request.connection property has been removed in v5. You should use request.socket instead.

// v4
fastify.get('/route', (req, reply) => {
console.log(req.connection.remoteAddress);
return { hello: 'world' };
});
// v5
fastify.get('/route', (req, reply) => {
console.log(req.socket.remoteAddress);
return { hello: 'world' };
});

这在 v4 中已弃用为 FSTDEP05,因此你应该已经更新了代码以使用新签名。

¥This was already deprecated in v4 as FSTDEP05, so you should have already updated your code to use the new signature.

reply.getResponseTime() 已被移除,改用 reply.elapsedTime

¥reply.getResponseTime() has been removed, use reply.elapsedTime instead

reply.getResponseTime() 方法已在 v5 中删除。你应该改用 reply.elapsedTime

¥The reply.getResponseTime() method has been removed in v5. You should use reply.elapsedTime instead.

// v4
fastify.get('/route', (req, reply) => {
console.log(reply.getResponseTime());
return { hello: 'world' };
});
// v5
fastify.get('/route', (req, reply) => {
console.log(reply.elapsedTime);
return { hello: 'world' };
});

这在 v4 中已弃用为 FSTDEP20,因此你应该已经更新了代码以使用新签名。

¥This was already deprecated in v4 as FSTDEP20, so you should have already updated your code to use the new signature.

fastify.hasRoute() 现在与 find-my-way 的行为一致

¥fastify.hasRoute() now matches the behavior of find-my-way

fastify.hasRoute() 方法现在与 find-my-way 的行为相匹配,并要求按照路由中的定义传递路由定义。

¥The fastify.hasRoute() method now matches the behavior of find-my-way and requires the route definition to be passed as it is defined in the route.

// v4
fastify.get('/example/:file(^\\d+).png', function (request, reply) { })

console.log(fastify.hasRoute({
method: 'GET',
url: '/example/12345.png'
)); // true
// v5

fastify.get('/example/:file(^\\d+).png', function (request, reply) { })

console.log(fastify.hasRoute({
method: 'GET',
url: '/example/:file(^\\d+).png'
)); // true

删除一些非标准 HTTP 方法

¥Removal of some non-standard HTTP methods

我们从 Fastify 中删除了以下 HTTP 方法:

¥We have removed the following HTTP methods from Fastify:

  • PROPFIND

  • PROPPATCH

  • MKCOL

  • COPY

  • MOVE

  • LOCK

  • UNLOCK

  • TRACE

  • SEARCH

现在可以使用 addHttpMethod 方法将它们添加回来。

¥It's now possible to add them back using the addHttpMethod method.

const fastify = Fastify()

// add a new http method on top of the default ones:
fastify.addHttpMethod('REBIND')

// add a new HTTP method that accepts a body:
fastify.addHttpMethod('REBIND', { hasBody: true })

// reads the HTTP methods list:
fastify.supportedMethods // returns a string array

有关更多信息,请参阅 #5567

¥See #5567 for more information.

删除对引用类型的支持在装饰器中

¥Removed support from reference types in decorators

现在禁止使用引用类型 (ArrayObject) 装饰请求/回复,因为此引用在所有请求之间共享。

¥Decorating Request/Reply with a reference type (Array, Object) is now prohibited as this reference is shared amongst all requests.

// v4
fastify.decorateRequest('myObject', { hello: 'world' });
// v5
fastify.decorateRequest('myObject');
fastify.addHook('onRequest', async (req, reply) => {
req.myObject = { hello: 'world' };
});

或者将其转换为函数

¥or turn it into a function

// v5
fastify.decorateRequest('myObject', () => { hello: 'world' });

或作为 getter

¥or as a getter

// v5
fastify.decorateRequest('myObject', {
getter () {
return { hello: 'world' }
}
});

有关更多信息,请参阅 #5462

¥See #5462 for more information.

删除对带有 Content-Type: application/json 标头和空主体的 DELETE 的支持

¥Remove support for DELETE with a Content-Type: application/json header and an empty body

在 v4 中,Fastify 允许带有 Content-Type: application/json 标头的 DELETE 请求,并且接受空主体。这在 v5 中不再允许。

¥In v4, Fastify allowed DELETE requests with a Content-Type: application/json header and an empty body was accepted. This is no longer allowed in v5.

有关更多信息,请参阅 #5419

¥See #5419 for more information.

插件不能再混合回调/promise API

¥Plugins cannot mix callback/promise API anymore

在 v4 中,插件可以混合回调和 promise API,从而导致意外行为。这在 v5 中不再允许。

¥In v4, plugins could mix the callback and promise API, leading to unexpected behavior. This is no longer allowed in v5.

// v4
fastify.register(async function (instance, opts, done) {
done();
});
// v5
fastify.register(async function (instance, opts) {
return;
});

or

// v5
fastify.register(function (instance, opts, done) {
done();
});

删除 getDefaultRoutesetDefaultRoute 方法

¥Removes getDefaultRoute and setDefaultRoute methods

getDefaultRoutesetDefaultRoute 方法已在 v5 中删除。

¥The getDefaultRoute and setDefaultRoute methods have been removed in v5.

有关更多信息,请参阅 #4485#4480。这在 v4 中已弃用为 FSTDEP014,因此你应该已经更新了代码。

¥See #4485 and #4480 for more information. This was already deprecated in v4 as FSTDEP014, so you should have already updated your code.

新功能

¥New Features

诊断通道支持

¥Diagnostic Channel support

Fastify v5 现在原生支持 诊断通道 API,并提供了一种跟踪请求生命周期的方法。

¥Fastify v5 now supports the Diagnostics Channel API natively and provides a way to trace the lifecycle of a request.

'use strict'

const diagnostics = require('node:diagnostics_channel')
const sget = require('simple-get').concat
const Fastify = require('fastify')

diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
console.log(msg.route.url) // '/:id'
console.log(msg.route.method) // 'GET'
})

diagnostics.subscribe('tracing:fastify.request.handler:end', (msg) => {
// msg is the same as the one emitted by the 'tracing:fastify.request.handler:start' channel
console.log(msg)
})

diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
// in case of error
})

const fastify = Fastify()
fastify.route({
method: 'GET',
url: '/:id',
handler: function (req, reply) {
return { hello: 'world' }
}
})

fastify.listen({ port: 0 }, function () {
sget({
method: 'GET',
url: fastify.listeningOrigin + '/7'
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.same(JSON.parse(body), { hello: 'world' })
})
})

有关更多详细信息,请参阅 documentation#5252

¥See the documentation and #5252 for additional details.

贡献者

¥Contributors

下面提供了所有核心 Fastify 软件包的完整贡献者列表。请考虑为那些能够接受赞助的人做出贡献。

¥The complete list of contributors, across all of the core Fastify packages, is provided below. Please consider contributing to those that are capable of accepting sponsorships.

贡献者赞助商链接软件包
10xLaCroixDrinker❤️ sponsorfastify-cli
Bram-dcfastify;fastify-swagger
BrianValentefastify
BryanAbatefastify-cli
Cadienvan❤️ sponsorfastify
Cangitfastify
Cyber​​lanefastify-elasticsearch
Eomm❤️ sponsorajv-compiler;fastify;fastify-awilix;fastify-diagnostics-channel;fastify-elasticsearch;fastify-hotwire;fastify-mongodb;fastify-nextjs;fastify-swagger-ui;under-pressure
EstebanDalelR❤️ sponsorfastify-cli
Fdawgs❤️ sponsoraws-lambda-fastify;csrf-protection;env-schema;fastify;fastify-accepts;fastify-accepts-serializer;fastify-auth;fastify-awilix;fastify-basic-auth;fastify-bearer-auth;fastify-caching;fastify-circuit-breaker;fastify-cli;fastify-cookie;fastify-cors;fastify-diagnostics-channel;fastify-elasticsearch;fastify-env;fastify-error;fastify-etag;fastify-express;fastify-flash;fastify-formbody;fastify-funky;fastify-helmet;fastify-hotwire;fastify-http-proxy;fastify-jwt;fastify-kafka;fastify-leveldb;fastify-mongodb;fastify-multipart;fastify-mysql;fastify-nextjs;fastify-oauth2;fastify-passport;fastify-plugin;fastify-postgres;fastify-rate-limit;fastify-redis;fastify-reply-from;fastify-request-context;fastify-response-validation;fastify-routes;fastify-routes-stats;fastify-schedule;fastify-secure-session;fastify-sensible;fastify-swagger-ui;fastify-url-data;fastify-websocket;fastify-zipkin;fluent-json-schema;forwarded;middie;point-of-view;process-warning;proxy-addr;safe-regex2;secure-json-parse;under-pressure
Gehbtfastify-secure-session
Gesma94fastify-routes-stats
H4ad❤️ sponsoraws-lambda-fastify
JohanMandersfastify-secure-session
LiviaMedeirosfastify
Momy93fastify-secure-session
MunifTanjimfastify-swagger-ui
Nanosyncfastify-secure-session
RafaelGSS❤️ sponsorfastify;under-pressure
Rantoledofastify
SMNBLMRRfastify
SimoneDevktfastify-cli
Tony133fastify
Uzlopak❤️ sponsorfastify;fastify-autoload;fastify-diagnostics-channel;fastify-hotwire;fastify-nextjs;fastify-passport;fastify-plugin;fastify-rate-limit;fastify-routes;fastify-static;fastify-swagger-ui;point-of-view;under-pressure
Zamiellfastify-secure-session
aadito123fastify
aaroncadillac❤️ sponsorfastify
aarontravassfastify
acro5piano❤️ sponsorfastify-secure-session
adamward459fastify-cli
adrai❤️ sponsoraws-lambda-fastify
alenap93fastify
alexandrucancescufastify-nextjs
anthonyringoetaws-lambda-fastify
arshcodemodfastify
autopulatedpoint-of-view
barbierifastify
beyazitfastify
big-kahuna-burger❤️ sponsorfastify-cli;fastify-compress;fastify-helmet
bilalshareeffastify-routes
blue86321fastify-swagger-ui
bodinsamuelfastify-rate-limit
busybox11❤️ sponsorfastify
climba03003csrf-protection;fastify;fastify-accepts;fastify-accepts-serializer;fastify-auth;fastify-basic-auth;fastify-bearer-auth;fastify-caching;fastify-circuit-breaker;fastify-compress;fastify-cors;fastify-env;fastify-etag;fastify-flash;fastify-formbody;fastify-http-proxy;fastify-mongodb;fastify-swagger-ui;fastify-url-data;fastify-websocket;middie
dancastillo❤️ sponsorfastify;fastify-basic-auth;fastify-caching;fastify-circuit-breaker;fastify-cors;fastify-helmet;fastify-passport;fastify-response-validation;fastify-routes;fastify-schedule
danny-andrewsfastify-kafka
davidcralph❤️ sponsorcsrf-protection
davideroffounder-pressure
dhensbyfastify-cli
dmkngfastify
domdomeggfastify
faustmanfastify-cli
floridemaifluent-json-schema
fox1tfastify-autoload
giuliowaitforitdavidefastify
gunters63fastify-reply-from
gurgundayfastify;fastify-circuit-breaker;fastify-cookie;fastify-multipart;fastify-mysql;fastify-rate-limit;fastify-response-validation;fastify-sensible;fastify-swagger-ui;fluent-json-schema;middie;proxy-addr;safe-regex2;secure-json-parse
ildellaunder-pressure
james-kagurufastify
jcbainfastify-http-proxy
jdhollanderfastify-swagger-ui
jean-micheletfastify;fastify-autoload;fastify-cli;fastify-mysql;fastify-sensible
johavenfastify-multipart
jordanebelangerfastify-plugin
jscheffnerfastify
jsprwfastify-secure-session
jsumners❤️ sponsorajv-compiler;avvio;csrf-protection;env-schema;fast-json-stringify;fastify;fastify-accepts;fastify-accepts-serializer;fastify-auth;fastify-autoload;fastify-awilix;fastify-basic-auth;fastify-bearer-auth;fastify-caching;fastify-circuit-breaker;fastify-compress;fastify-cookie;fastify-cors;fastify-env;fastify-error;fastify-etag;fastify-express;fastify-flash;fastify-formbody;fastify-funky;fastify-helmet;fastify-http-proxy;fastify-jwt;fastify-kafka;fastify-leveldb;fastify-multipart;fastify-mysql;fastify-oauth2;fastify-plugin;fastify-postgres;fastify-redis;fastify-reply-from;fastify-request-context;fastify-response-validation;fastify-routes;fastify-routes-stats;fastify-schedule;fastify-secure-session;fastify-sensible;fastify-static;fastify-swagger;fastify-swagger-ui;fastify-url-data;fastify-websocket;fastify-zipkin;fluent-json-schema;forwarded;light-my-request;middie;process-warning;proxy-addr;safe-regex2;secure-json-parse;under-pressure
karankrainaunder-pressure
kerolloz❤️ sponsorfastify-jwt
kibertoadfastify-rate-limit
kukidon-devfastify-passport
kunal097fastify
lamweilifastify-sensible
lemonclownfastify-mongodb
liuhanqufastify
matthykfastify-plugin
mch-dskfastify
mcollina❤️ sponsorajv-compiler;avvio;csrf-protection;fastify;fastify-accepts;fastify-accepts-serializer;fastify-auth;fastify-autoload;fastify-awilix;fastify-basic-auth;fastify-bearer-auth;fastify-caching;fastify-circuit-breaker;fastify-cli;fastify-compress;fastify-cookie;fastify-cors;fastify-diagnostics-channel;fastify-elasticsearch;fastify-env;fastify-etag;fastify-express;fastify-flash;fastify-formbody;fastify-funky;fastify-helmet;fastify-http-proxy;fastify-jwt;fastify-kafka;fastify-leveldb;fastify-multipart;fastify-mysql;fastify-oauth2;fastify-passport;fastify-plugin;fastify-postgres;fastify-rate-limit;fastify-redis;fastify-reply-from;fastify-request-context;fastify-response-validation;fastify-routes;fastify-routes-stats;fastify-schedule;fastify-secure-session;fastify-static;fastify-swagger;fastify-swagger-ui;fastify-url-data;fastify-websocket;fastify-zipkin;fluent-json-schema;light-my-request;middie;point-of-view;proxy-addr;secure-json-parse;under-pressure
melroy89❤️ sponsorunder-pressure
metcoder95❤️ sponsorfastify-elasticsearch
mhamannfastify-cli
mihaurfastify-elasticsearch
mikesammfastify
mikhael-abdallahsecure-json-parse
miquelfire❤️ sponsorfastify-routes
mirariesfastify-swagger-ui
mohab-samehfastify
monish001fastify
moradebianchetti81fastify
mouhannad-shaws-lambda-fastify
multivoltagepoint-of-view
muya❤️ sponsorunder-pressure
mweberxyzpoint-of-view
nflaigfastify
nickfla1avvio
o-azprocess-warning
ojeytonwilliamscsrf-protection
onosendifastify-formbody
philippviereckfastify
pip77fastify-mongodb
puskin94fastify
remidewittefastify
rozzillafastify
samialduryfastify-cli
sknetlfastify-cors
sourcecodeitfastify
synapseenv-schema
timursaurussecure-json-parse
tlhunterfastify
tlund101fastify-rate-limit
ttshiversfastify-http-proxy
voxpelli❤️ sponsorfastify
weixinwufastify-cli
zetarakufastify-cli