在 Hapi 中的生命周期是整个应用程序执行时的各个阶段,每个阶段都有钩子函数(又称为生命周期钩子),允许开发人员在适当的时间处理请求并向客户端返回响应。本文将从深度和指导意义方面详细介绍 Hapi 生命周期。
Hapi 生命周期的重要阶段
Hapi 生命周期的主要阶段如下:
onRequest: 在 Hapi 处理请求的最早期调用。您可以使用这个生命周期在请求进入服务器之前进行一些操作,例如鉴权或记录请求。如果在这个生命周期中发送响应,Hapi 将跳过所有其他生命周期并返回响应到客户端。示例代码:
server.ext('onRequest', (request, h) => { console.log('Request received: ' + request.path); return h.continue; });onPreAuth: 在 Hapi 处理请求之前调用鉴权策略。您可以使用这个生命周期来钩入您的鉴权逻辑。Hapi 中鉴权策略的具体实现有很多种,可以用成熟的外部模块,例如hapi-auth-jwt2、hapi-auth-basic等,在此不作赘述。onPostAuth: 在 Hapi 鉴权策略处理请求后调用。可以对于鉴权完成的请求做一些后续的处理,例如设置用户权限。如果在此阶段发送响应,Hapi 将跳过所有其他生命周期并返回响应到客户端。示例代码:
server.ext('onPostAuth', (request, h) => { if (request.auth.isAuthenticated) { request.user.role = 'admin'; } return h.continue; });onPreHandler: 当 Hapi 将请求路由到特定路由处理程序之前调用。这个生命周期可用于在请求到达 API 之前格式化它。例如,解析查询字符串或在数据验证之前进行预处理。示例代码:
server.ext('onPreHandler', (request, h) => { request.query.pageNum = Number(request.query.pageNum); return h.continue; });onPostHandler: 在 Hapi 处理程序返回以更新响应前调用。您可以使用此生命周期在服务器向客户端返回响应之前对其进行另一些更改。例如,对于响应进行格式化或调用后端服务。示例代码:
server.ext('onPostHandler', (request, h) => { request.response.source.pageCount = Math.ceil(request.response.source.count / request.query.pageSize); return h.continue; });onPreResponse: 生命周期列表中的最后一个生命周期。在 Hapi 准备向客户端发送响应之前调用。如果您需要在响应退出服务器并通过网络发送之前看到响应,则可以使用此生命周期。示例代码:
server.ext('onPreResponse', (request, h) => { const response = request.response; if (response.isBoom && (response.output.statusCode === 404)) { return h.view('404'); } return h.continue; });
其他 Hapi 生命周期的钩子
除了上述阶段外,Hapi 的生命周期还有几个其他钩子,可以更精细地控制请求的处理过程。例如:onTimeout、onPreStart 和 onPostStop。
结果
Hapi 的生命周期是全面的,应用程序在处理请求时可以附着和产生的处理方式。借助这些生命周期钩子,我们可以更好地控制请求的处理,也可以使代码的逻辑清晰明了、易于维护。
希望本指南可以帮助初学者更好地掌握 Hapi 的生命周期,为实际项目开发提供实用指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d01801e46428fe9ecadacb