Fastify 是一款快速、低开销且可扩展的 Web 框架,它提供了丰富的请求和响应处理方式。在本文中,我们将深入探讨 Fastify 中的请求和响应处理方式,并通过示例代码演示如何使用它们。
请求处理方式
在 Fastify 中,请求处理方式主要包括路由、请求钩子和请求上下文。
路由
Fastify 的路由支持动态路由、参数校验、正则表达式路由等。以下是一个简单的路由示例:
fastify.get('/user/:id', async (req, reply) => { const id = req.params.id const user = await User.findById(id) reply.send(user) })
上面的路由指定了路径为 /user/:id
,其中 :id
表示参数。在路由处理函数中,我们从请求对象 req
中获取参数值,再通过指定的查询条件在数据库中查找对应的用户,最后通过响应对象 reply
返回查询结果。
请求钩子
Fastify 的请求钩子可以在请求到达路由处理函数之前或之后执行一些操作,例如校验请求参数、记录请求日志等。以下是一个简单的请求钩子示例:
fastify.addHook('preHandler', (req, reply, done) => { const { id } = req.params if (!id) { reply.code(400).send(new Error('Missing ID parameter')) } else { done() } })
上面的请求钩子定义在路由处理函数之前,它从请求对象 req
中获取参数 id
,如果参数不存在则返回错误响应;否则直接执行回调函数 done()
,继续执行后续操作。
请求上下文
在 Fastify 中,请求上下文包含了路由、请求钩子和中间件处理过程中的一些上下文信息,例如请求参数、响应数据等。以下是一个简单的请求上下文示例:
fastify.get('/user/:id', async (req, reply) => { const ctx = { params: req.params, query: req.query, user: await User.findById(req.params.id) } reply.context(ctx).send(ctx.user) })
上面的示例将路由参数、查询参数和数据库查询结果打包为一个请求上下文对象 ctx
,然后通过响应对象 reply
的 context()
方法将上下文对象保存到响应对象中,在后续操作中可以方便地获取请求上下文信息。
响应处理方式
在 Fastify 中,响应处理方式主要包括响应状态码、响应头和响应数据。
响应状态码
Fastify 的响应状态码支持自定义扩展,例如可以使用 HTTP 规范以外的状态码,或者使用自定义错误码。以下是一个简单的自定义状态码示例:
-- -------------------- ---- ------- ----- ------------ - - ---- -------- ---- ---- ----- --- ------ - ------------------------------ -------- ------ -------- - ----- ------ - -------------- ----- --- - ------- -- -------------------- -- -------- ------ ------ -------------------------- ----------- -- ------------------------ ----- ----- ------ -- - ----- - -- - - ---------- ----- ---- - ----- ----------------- -- ------- - ---------------- - ---- - ---------------- - --
上面的示例定义了一个自定义响应方法 error()
,它接受一个状态码和可选的错误消息参数,将状态码转换为整数并根据预定义的状态码表获取对应的错误消息,最终通过响应对象 reply
返回错误响应。
响应头
Fastify 的响应头支持设置多个自定义头部、跨域资源共享(CORS)头部、缓存控制头部等。以下是一个简单的响应头示例:
fastify.get('/user/:id', async (req, reply) => { const { id } = req.params const user = await User.findById(id) reply.header('X-Access-Token', 'xxx') reply.header('Cache-Control', 'no-cache') reply.send(user) })
上面的示例使用 header()
方法分别设置了一个自定义头部 X-Access-Token
和一个缓存控制头部 Cache-Control
,然后通过响应对象 reply
返回响应数据。
响应数据
Fastify 的响应数据支持多种数据格式,例如 JSON、HTML、二进制数据等。以下是一个简单的 JSON 响应示例:
fastify.get('/user/:id', async (req, reply) => { const { id } = req.params const user = await User.findById(id) reply.send(user) })
上面的示例通过响应对象 reply
返回一个 JSON 格式的用户数据,它会根据数据格式自动设置响应头部的 Content-Type
字段为 application/json
。
总结
Fastify 提供了丰富的请求和响应处理方式,包括路由、请求钩子、请求上下文、响应状态码、响应头和响应数据。通过熟悉和掌握这些处理方式,能够使我们更高效和灵活地处理和响应 Web 请求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ce0e6fb5eee0b525602b8d