中间件
从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 使用内部的
Request 和 Reply 对象包装传入的 req
和 res
Node 实例,但这是在中间件阶段之后进行的。要创建中间件,请使用 Node 的 req
和 res
实例。或者,可以使用已经具有 Fastify Request 和
Reply 实例的 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
。