中间件
中间件
从 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 响应 实例的其他特定方法。这是因为 Fastify 使用 请求 和 响应 对象在内部包装传入的 req
和 res
Node 实例,但这在中间件阶段之后完成。如果您需要创建中间件,则必须使用 Node 的 req
和 res
实例。否则,您可以使用已经拥有 请求 和 响应 Fastify 实例的 preHandler
钩子。有关更多信息,请参阅 钩子。
将中间件执行限制到某些路径
如果您只需要在某些路径下运行中间件,只需将路径作为第一个参数传递给 use
即可!
请注意,这不支持带参数的路由(例如 /user/:id/comments
),并且在多个路径中不支持通配符。
const path = require('node:path')
const serveStatic = require('serve-static')
// Single path
fastify.use('/css', serveStatic(path.join(__dirname, '/assets')))
// Wildcard path
fastify.use('/css/(.*)', serveStatic(path.join(__dirname, '/assets')))
// Multiple paths
fastify.use(['/css', '/js'], serveStatic(path.join(__dirname, '/assets')))
替代方案
Fastify 提供了一些最常用中间件的替代方案,例如 @fastify/helmet
(用于 helmet
)、@fastify/cors
(用于 cors
) 和 @fastify/static
(用于 serve-static
)。