跳至主要内容
版本: 最新版本 (v5.0.x)

中间件

中间件

从 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 使用 请求响应 对象在内部包装传入的 reqres Node 实例,但这在中间件阶段之后完成。如果您需要创建中间件,则必须使用 Node 的 reqres 实例。否则,您可以使用已经拥有 请求响应 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)。