Hapi 资源共享的正确姿势

阅读时长 5 分钟读完

Hapi 是一款 Node.js 的 Web 框架,它的模块化和可扩展性使得它成为了很多企业级应用的首选。在使用 Hapi 进行开发时,我们常常需要共享一些资源,例如数据库连接、配置信息等等。本文将介绍 Hapi 资源共享的正确姿势,帮助大家更好地进行开发。

问题

在 Hapi 中,我们可以通过 server.decorate() 方法对 server 进行扩展。例如,我们可以在 server 上添加一个方法,用于获取数据库连接:

然后在路由处理函数中调用该方法即可获取数据库连接:

-- -------------------- ---- -------
--------------
  ------- ------
  ----- ---------
  -------- ----- --------- -- -- -
    ----- -- - -----------------------
    ----- ----- - ----- ----------------------------------------
    ------ ------
  -
---
展开代码

这种方式看起来很简单,但是它存在一些问题:

  • 每次调用 getDb() 方法都会创建一个新的数据库连接,这会导致性能问题。
  • 如果我们需要在多个地方共享同一个数据库连接,应该怎么办?

解决方案

为了解决上述问题,我们可以使用 Hapi 插件机制,在 server 上注册一个插件,该插件负责创建和管理数据库连接。

首先,我们来看一下如何创建一个 Hapi 插件。一个 Hapi 插件实际上就是一个包含多个方法的对象,其中最重要的是 register() 方法,该方法用于在 server 上注册插件:

在 register() 方法中,我们可以使用 server.decorate() 方法对 server 进行扩展,也可以使用 server.ext() 方法在请求处理周期中添加钩子函数。例如,我们可以在 register() 方法中创建数据库连接,并将其保存在 server.app 对象中:

在路由处理函数中,我们可以通过 request.server.app.db 获取数据库连接:

-- -------------------- ---- -------
--------------
  ------- ------
  ----- ---------
  -------- ----- --------- -- -- -
    ----- -- - ----------------------
    ----- ----- - ----- ----------------------------------------
    ------ ------
  -
---
展开代码

这样,我们就可以在多个地方共享同一个数据库连接了。另外,由于数据库连接是在插件注册时创建的,因此只会创建一次,不会影响性能。

结论

在 Hapi 中,我们可以使用 server.decorate() 方法对 server 进行扩展,但是这种方式不适合共享资源。为了解决共享资源的问题,我们可以使用 Hapi 插件机制,在 server 上注册一个插件,该插件负责创建和管理资源。这样,我们就可以在多个地方共享同一个资源了。

示例代码

-- -------------------- ---- -------
----- ---- - ----------------------
----- ----------- - -------------------------------

----- -------- - -
  ----- ------------
  --------- ----- -------- -------- -- -
    ----- -- - ----- ------------------------------------------------------
    ------------- - --------------
  -
--

----- ---- - ----- -- -- -
  ----- ------ - -------------
    ----- -----
    ----- -----------
  ---

  ----- --------------------------

  --------------
    ------- ------
    ----- ---------
    -------- ----- --------- -- -- -
      ----- -- - ----------------------
      ----- ----- - ----- ----------------------------------------
      ------ ------
    -
  ---

  ----- ---------------
  ------------------- ------- -- ---- -----------------
--

-------------------------------- ----- -- -
  -----------------
  ----------------
---

-------
展开代码

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676b675e78388e33bb2245f4

纠错
反馈

纠错反馈