Skip to Content

中间件

从Fastify v3.0.0版本开始,中间件不再默认支持,并且需要使用外部插件如 @fastify/express 或者 @fastify/middie

注册 @fastify/express 插件以使用 Express 中间件的示例:

await fastify.register(require('@fastify/express')) fastify.use(require('cors')()) fastify.use(require('dns-prefetch-control')()) fastify.use(require('frameguard')()) fastify.use(require('hsts')()) fastify.use(require('ienoopen')()) fastify.use(require('x-xss-protection')())

也可以使用 @fastify/middie,它提供了简单的 Express 风格中间件支持,并且性能有所提升:

await fastify.register(require('@fastify/middie')) fastify.use(require('cors')())

中间件可以被封装,允许使用 register 方法控制其运行位置,如在 插件指南 中所述。

Fastify 的中间件不暴露 send 方法或其他特定于 Fastify Reply 实例的方法。这是因为 Fastify 使用内部的 RequestReply 对象包装传入的 reqres Node 实例,但这是在中间件阶段之后进行的。要创建中间件,请使用 Node 的 reqres 实例。或者,可以使用已经具有 Fastify RequestReply 实例的 preHandler 钩子。有关更多信息,请参阅 Hooks

限制中间件在特定路径下的执行

要在特定路径下运行中间件,请将路径作为第一个参数传递给 use

ℹ️ 注意:这不支持带有参数的路由(例如 /user/:id/comments),并且多条路径中不支持通配符。

const path = require('node:path') const serveStatic = require('serve-static') // 单个路径 fastify.use('/css', serveStatic(path.join(__dirname, '/assets'))) // 通配符路径 fastify.use('/css/(.*)', serveStatic(path.join(__dirname, '/assets'))) // 多个路径 fastify.use(['/css', '/js'], serveStatic(path.join(__dirname, '/assets')))

替代方案

Fastify 提供了常用中间件的替代品,例如: @fastify/helmet 用于 helmet@fastify/cors 用于 cors,以及 @fastify/static 用于 serve-static