Fastify 是一个快速、低开销、可扩展的 Node.js Web 框架。它的路由功能非常强大,本文将详细介绍 Fastify 框架的路由功能。
路由基础
路由是 Web 应用程序的基础。它将请求映射到处理程序并返回响应。在 Fastify 中,路由是由 HTTP 方法、路径和处理程序组成的。
HTTP 方法
HTTP 方法是指定义了请求的操作类型的标准方法。常见的 HTTP 方法有 GET、POST、PUT、DELETE 等。在 Fastify 中,可以使用 get
、post
、put
、delete
等方法来定义路由。
示例代码:
fastify.get('/hello', (request, reply) => { reply.send('Hello World!') })
上面的代码定义了一个 GET 方法的路由,路径为 /hello
,处理程序为一个简单的回调函数,返回一个字符串 'Hello World!'
。
路径
路径是指请求的 URL 中除了主机名和端口号之外的部分。在 Fastify 中,可以使用字符串或正则表达式来定义路由的路径。
示例代码:
fastify.get('/hello/:name', (request, reply) => { const name = request.params.name reply.send(`Hello ${name}!`) })
上面的代码定义了一个 GET 方法的路由,路径为 /hello/:name
,其中 :name
表示一个参数,可以在处理程序中通过 request.params.name
来获取它的值。如果请求的 URL 是 /hello/world
,则返回的字符串为 'Hello world!'
。
处理程序
处理程序是指处理请求的函数。在 Fastify 中,可以使用回调函数、异步函数、Promise 等方式来定义路由的处理程序。
示例代码:
// javascriptcn.com 代码示例 fastify.get('/hello', async (request, reply) => { const name = await getName() reply.send(`Hello ${name}!`) }) function getName() { return new Promise(resolve => { setTimeout(() => { resolve('World') }, 1000) }) }
上面的代码定义了一个 GET 方法的路由,路径为 /hello
,处理程序为一个异步函数。在处理程序中,通过调用 getName
函数来获取一个名字,然后返回一个字符串,其中包含这个名字。
路由选项
除了 HTTP 方法、路径和处理程序之外,Fastify 还提供了一些路由选项,用于控制路由的行为。
schema
schema
选项用于定义路由的请求和响应的 JSON Schema。JSON Schema 是一种用于描述 JSON 数据结构的语言。使用 JSON Schema 可以更好地定义 API 的请求和响应格式,提高 API 的可读性和可维护性。
示例代码:
// javascriptcn.com 代码示例 const schema = { querystring: { type: 'object', properties: { name: { type: 'string' }, age: { type: 'integer' } }, required: ['name'] } } fastify.get('/hello', { schema }, (request, reply) => { const name = request.query.name reply.send(`Hello ${name}!`) })
上面的代码定义了一个 GET 方法的路由,路径为 /hello
,定义了一个 JSON Schema,要求请求的查询字符串中必须包含 name
属性,类型为字符串。如果请求的查询字符串中不包含 name
属性,则返回一个 400 错误。
preHandler
preHandler
选项用于定义一个或多个中间件函数,用于在处理程序之前执行。中间件函数可以用于验证请求、设置请求参数、缓存响应等操作。
示例代码:
// javascriptcn.com 代码示例 function authenticate(request, reply, done) { const token = request.headers['authorization'] if (!token) { reply.status(401).send('Unauthorized') } else { done() } } fastify.get('/hello', { preHandler: authenticate }, (request, reply) => { const name = request.query.name reply.send(`Hello ${name}!`) })
上面的代码定义了一个 GET 方法的路由,路径为 /hello
,定义了一个中间件函数 authenticate
,用于验证请求是否包含有效的身份验证令牌。如果请求不包含身份验证令牌,则返回一个 401 错误。
handler
handler
选项用于定义一个处理程序函数,它将替换路由中定义的处理程序函数。使用 handler
选项可以使路由的处理程序更具可读性和可维护性。
示例代码:
function hello(request, reply) { const name = request.query.name reply.send(`Hello ${name}!`) } fastify.get('/hello', { handler: hello })
上面的代码定义了一个 GET 方法的路由,路径为 /hello
,定义了一个处理程序函数 hello
,它将替换路由中定义的处理程序函数。
路由分组
当应用程序有很多路由时,将它们分组可以使代码更具可读性和可维护性。在 Fastify 中,可以使用 route
方法来定义路由分组。
示例代码:
// javascriptcn.com 代码示例 fastify.route({ method: 'GET', url: '/users', handler: getUsers }) fastify.route({ method: 'POST', url: '/users', handler: createUser }) fastify.route({ method: 'GET', url: '/users/:id', handler: getUser }) function getUsers(request, reply) { // ... } function createUser(request, reply) { // ... } function getUser(request, reply) { // ... }
上面的代码定义了一个路由分组,包含三个路由,分别是获取用户列表、创建用户和获取用户信息。使用路由分组可以使路由更具有组织性和可读性。
路由前缀
当应用程序的所有路由都需要一个共同的前缀时,可以使用 prefix
方法来定义路由前缀。
示例代码:
fastify.register(require('fastify-auth')) fastify .register(require('./routes/users'), { prefix: '/api' }) .register(require('./routes/products'), { prefix: '/api' })
上面的代码定义了一个路由前缀 /api
,并将路由分组 users
和 products
注册到该前缀下。使用路由前缀可以使路由更具有组织性和可读性。
总结
Fastify 框架的路由功能非常强大,它支持多种 HTTP 方法、路径和处理程序,以及路由选项、路由分组和路由前缀等高级功能。使用 Fastify 框架可以使开发者更轻松地创建高性能、可扩展的 Web 应用程序。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656d4796d2f5e1655d5944d7