Hapi 是一个完备的 Node.js Web 应用程序框架,具有良好的插件扩展机制,可以极大地简化应用程序的开发过程。插件可以提供路由、身份验证、缓存、数据库等功能,让应用程序更加健壮和可扩展。在本文中,我们将探讨 Hapi 插件的开发与使用,希望对前端开发者有所启发。
插件开发
准备工作
在开始之前,请确保您已经安装了 Node.js 和 Hapi。如果没有,请参考 Hapi 官方文档 进行安装。
创建插件
插件是一个通过 module.exports
导出的对象。以下是一个简单的插件:
exports.plugin = { name: 'examplePlugin', version: '1.0.0', register: function(server, options) { console.log('Plugin registered!'); } };
这个插件只是一个简单的输出信息的函数,可以在 Hapi 应用程序中以以下方式使用:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ------------- - ----------------------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ------------------------------- ----- --------------- ------------------- ------- -- ---- ----------------- -- -------展开代码
在注册插件时,Hapi 将调用插件中的 register
函数,这个函数会接收 Hapi 服务器对象和插件选项。此函数中通常会设置路由、身份验证、缓存等插件特定的功能。
Plugin options
插件选项可以通过插件导出对象中的 options
属性来实现。以下是一个带有选项的插件:
-- -------------------- ---- ------- -------------- - - ----- ---------------- -------- -------- --------- ---------------- -------- - ------------------- ---- ------ ------------------------ -------------- -- -------- - -------------- ------- ------- - --展开代码
在注册插件时可以提供选项,例如:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ------------- - ----------------------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ----------------- ------- -------------- -------- - -------------- -------- ---- -- ------- - --- ----- --------------- ------------------- ------- -- ---- ----------------- -- -------展开代码
这里将覆盖插件默认的 exampleOption
选项。
从文件夹加载插件
在应用程序中可以从文件夹加载一个或多个插件,如下所示:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ----------------- ----------------------------------- -------------------------------- --- ----- --------------- ------------------- ------- -- ---- ----------------- -- -------展开代码
在文件夹中的插件必须具有 name
和 version
属性。
Hapi-PLUGIN 模式的插件开发
插件可以使用 Hapi-PLUGIN 模式开发,在这种模式下插件只需定义一个单独的函数并返回一个函数。通常情况下,这些插件函数是异步的,接收一些参数。
以下是 Hapi-PLUGIN 模式的插件示例:
-- -------------------- ---- ------- -------------- - - ----- ---------------- -------- -------- --------- ----- ---------------- -------- - ----- -------------- ------- ------ ----- ---- -------- ----------------- -- - ------ ------------------ --------- - --- - --展开代码
可以看到,Hapi-PLUGIN 模式的插件开发更加简洁和清晰。
插件使用
官方插件
首先,值得注意的是 Hapi 附带了一些官方插件,例如:
- hapi-auth-basic: 基本 HTTP 身份验证。
- hapi-auth-cookie: 基于 Cookie 的身份验证。
- hapi-pino: 得到 pino 记录器和日志记录工具。
- hapi-rate-limit: 基于 Redis 的速率限制。
- hapi-swagger: 自动生成文档的 Swagger 接口元数据。
等等。
这些插件可以根据需要使用。例如:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ----------------- ----------------------- ----------------------- --- -- --- -------------- -------- ------------------------------ -------- - -------- --- ----- --------------- ------------------- ------- -- ---- ----------------- -- -- ------ ---------- -------- ----- -------- - ----- --------- --------- --------- -- -- - -- --------- --- ------- -- -------- --- ----------- - ------ - -------- ---- -- - ------ - -------- ----- -- -- -------展开代码
在这里我们添加了 hapi-auth-basic 和 hapi-auth-cookie 插件,并创建了一个名为“simple”的身份验证策略。
自定义插件
自定义插件可以提供许多不同的功能。
例如:
-- -------------------- ---- ------- -------------- - - ----- ---------------- -------- -------- --------- ----- ---------------- -------- - ----- -------------- ------- ------ ----- ---- -------- ----------------- -- - ------ ---------------------------- - --- -- -------- - -------- ------- ------- - --展开代码
这个插件可以返回一个固定的响应。
在内部,插件可以使用服务器实例的方法,如 server.route()
和 server.auth.strategy()
等。
就像前面的示例中一样,插件可以具有选项。这些选项传递给插件的 register
函数。
预先定义的插件选项
Hapi 框架提供了许多默认选项,可以通过这些选项来控制插件的行为。
- routes: 插件使用的路由。
- once: 插件只执行一次。
- multiple: 插件可多次执行。
- dependencies: 插件依赖于其他插件。
- data: 保存插件数据。
- sandbox: 为插件提供隔离的沙盒环境。
在 options
属性中指定这些选项。
回调函数
在 Hapi 插件中,可以使用回调函数来报告插件的异步执行结果。
以下是一个异步操作完成后执行回调函数的例子:
-- -------------------- ---- ------- -------------- - - ----- ---------------- -------- -------- --------- ----- ---------------- -------- - ----- ------ - ----- --- ----------------- ------- -- - ------------- -- - --------------------------- -------- -- ------ --- ------------------------- - ----- ------ --- -- -------- - -------- ------- ------- - --展开代码
在这个例子中,我们向服务器实例发出一个事件,以通知我们操作已经完成。
插件应用程序接口
Hapi 框架提供了一些可用于插件的方法和属性:
- server.plugins.pluginName: 按名称访问已注册的插件。
- server.decorate(type, property, method): 为 Hapi 服务器添加新的装饰项。
- server.ext(events, method): 为特定事件添加服务器扩展点。
- server.realm: 返回当前服务器对应的 realm 对象,控制插件是否可以访问服务器实例的属性和方法。
总结
插件是 Hapi 框架的重要组成部分,可以大大简化应用程序的开发和维护。在本文中,我们讨论了如何创建自定义插件,并探讨了如何使用官方插件。希望这篇文章对前端开发者有所启发,并在 Hapi 开发中提供了一些指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/654b6a767d4982a6eb54391a