返回介绍

server.route(route)

发布于 2024-02-12 19:53:56 字数 4150 浏览 0 评论 0 收藏 0

添加路由:

  • route - 路由配置对象或配置对象数组,其中每个对象包含:

    • path - (必要) 用于匹配传入请求的绝对路径(必须以'/'开头)。 根据服务器的 router 配置将传入请求与配置的路径进行比较。 该路径可以包括括在 {} 中的命名参数,它将与请求中的文字值进行匹配,如 Path parameters 中所述。

    • method - (必要) HTTP 方法. 通常是其中之一 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', or 'OPTIONS'. 允许任何 非 'HEAD' 的 HTTP 方法。 使用 '*' 匹配任何 HTTP 方法 (仅当未找到完全匹配时,与特定方法的任何匹配将优先于通配符匹配). 可以分配一组方法,这些方法与手动添加具有不同方法的相同路径具有相同的结果。

    • vhost - (可选) 域字符串或域字符串数组,用于将路由限制为仅具有匹配主机头字段的请求。 匹配仅针对 header 的主机名部分(不包括端口)。. 默认为 所有 hosts.

    • handler - (必要 当 handler 没有设置) 调用路由处理函数以在成功进行身份验证和验证后生成响应。

    • options - 额外的 route options . options 值可以是使用签名 function(server) 返回对象的对象或函数,其中 server 是添加路由的服务器, this 绑 定到当前 realm 的 bind 选项。

    • rules - route 自定义规则对象. 该对象被传递给使用 server.rules() 注册的每个规则处理器。如果定义了 route.options.rules ,则无法使用。

返回值: none.

请注意, options 对象被深度克隆(除了浅层复制的 bind )并且不能包含任何不安全的值来执行深层复制。

const Hapi = require('hapi');
const server = Hapi.server({ port: 80 });

// Handler in top level

server.route({ method: 'GET', path: '/status', handler: () => 'ok' });

// Handler in config

const user = {
  cache: { expiresIn: 5000 },
  handler: function (request, h) {

    return { name: 'John' };
  }
};

server.route({ method: 'GET', path: '/user', config: user });

// An array of routes

server.route([
  { method: 'GET', path: '/1', handler: function (request, h) { return 'ok'; } },
  { method: 'GET', path: '/2', handler: function (request, h) { return 'ok'; } }
]);

路径参数

通过将命名参数与该路径段处的传入请求路径的内容进行匹配来处理参数化路径。 例如, '/book/{id}/cover' 将匹配 '/book/123/cover'request.params.id 将被设置为 '123' 。 每个路径段(开头 '/' 和关闭 '/' 之间的所有内容,除非它是路径的末尾)只能包含一个命名参数。 参数可以覆盖整个段( '/{param}' ) 或段的一部分( '/file.{ext}' )。 路径参数可能只包含字母,数字和下划线,例如 '/{file-name}' 是无效的, '/{file_name}' 有效

参数名后面的可选 '?' 后缀表示可选参数(仅当参数位于路径的末尾或仅覆盖段的一部分时才允许,如 '/a{param?}/b' )。 例如,路由 '/book/{id?}' 匹配 '/book/' ,其中 request.params.id 的值设置为空字符串 ''

const Hapi = require('hapi');
const server = Hapi.server({ port: 80 });

const getAlbum = function (request, h) {

  return 'You asked for ' +
    (request.params.song ? request.params.song + ' from ' : '') +
    request.params.album;
};

server.route({
  path: '/{album}/{song?}',
  method: 'GET',
  handler: getAlbum
});

除了可选的 ? 后缀之外,参数名称也可以使用 * 后缀指定匹配段的数量, 后跟一个大于 1 的数字。如果预期部分的数字可以是任何东西,然后使用没有数字的 * (匹配任意数量的段只能在最后一个路径段中使用)。

const Hapi = require('hapi');
const server = Hapi.server({ port: 80 });

const getPerson = function (request, h) {

  const nameParts = request.params.name.split('/');
  return { first: nameParts[0], last: nameParts[1] };
};

server.route({
  path: '/person/{name*2}',   // Matches '/person/john/doe'
  method: 'GET',
  handler: getPerson
});

Path matching order

路由器在每个传入请求上遍历路由表,并执行第一个(也是唯一的)匹配路由。 路由匹配是基于请求路径和 HTTP 方法的组合完成的(例如'GET,'POST')。 查询从路由逻辑中排除。 请求以确定性顺序匹配,其中添加路由的顺序无关紧要。

根据在传入请求路径的每个段上评估的路由的特异性来匹配路由。 每个请求路径都被拆分为其段(由 '/' 分隔的部分)。 这些段一次一个地与路由表进行比较,并与最具体的路径进行匹配,直到找到匹配为止。 如果未找到匹配项,则尝试下一次匹配。

匹配路由时,字符串文字(无路径参数)具有最高优先级, 然后是混合参数( '/a{p}b' ),参数 ( '/{p}' ) ,最后是通配符( /{p*} )。

请注意,混合参数比较慢,因为它们无法进行散列,并且需要对表示每个路由表节点上的各种混合参数的所有正则表达式进行数组迭代。

Catch all route

如果应用程序需要覆盖默认的 Not Found(404)错误响应,它可以为特定方法或所有方法添加 catch-all 路由。只能定义一个 catch-all 路由。

const Hapi = require('hapi');
const server = Hapi.server({ port: 80 });

const handler = function (request, h) {

  return h.response('The page was not found').code(404);
};

server.route({ method: '*', path: '/{p*}', handler });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文