Hapi 是一款 Node.js 的 Web 框架,它的模块化和可扩展性使得它成为了很多企业级应用的首选。在使用 Hapi 进行开发时,我们常常需要共享一些资源,例如数据库连接、配置信息等等。本文将介绍 Hapi 资源共享的正确姿势,帮助大家更好地进行开发。
问题
在 Hapi 中,我们可以通过 server.decorate() 方法对 server 进行扩展。例如,我们可以在 server 上添加一个方法,用于获取数据库连接:
server.decorate('server', 'getDb', async () => { const db = await MongoClient.connect('mongodb://localhost:27017/mydb'); return db.db('mydb'); });
然后在路由处理函数中调用该方法即可获取数据库连接:
-- -------------------- ---- ------- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - ----- -- - ----------------------- ----- ----- - ----- ---------------------------------------- ------ ------ - ---展开代码
这种方式看起来很简单,但是它存在一些问题:
- 每次调用 getDb() 方法都会创建一个新的数据库连接,这会导致性能问题。
- 如果我们需要在多个地方共享同一个数据库连接,应该怎么办?
解决方案
为了解决上述问题,我们可以使用 Hapi 插件机制,在 server 上注册一个插件,该插件负责创建和管理数据库连接。
首先,我们来看一下如何创建一个 Hapi 插件。一个 Hapi 插件实际上就是一个包含多个方法的对象,其中最重要的是 register() 方法,该方法用于在 server 上注册插件:
const MyPlugin = { name: 'my-plugin', register: async (server, options) => { // 插件逻辑 } };
在 register() 方法中,我们可以使用 server.decorate() 方法对 server 进行扩展,也可以使用 server.ext() 方法在请求处理周期中添加钩子函数。例如,我们可以在 register() 方法中创建数据库连接,并将其保存在 server.app 对象中:
const MyPlugin = { name: 'my-plugin', register: async (server, options) => { const db = await MongoClient.connect('mongodb://localhost:27017/mydb'); server.app.db = db.db('mydb'); } };
在路由处理函数中,我们可以通过 request.server.app.db 获取数据库连接:
-- -------------------- ---- ------- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - ----- -- - ---------------------- ----- ----- - ----- ---------------------------------------- ------ ------ - ---展开代码
这样,我们就可以在多个地方共享同一个数据库连接了。另外,由于数据库连接是在插件注册时创建的,因此只会创建一次,不会影响性能。
结论
在 Hapi 中,我们可以使用 server.decorate() 方法对 server 进行扩展,但是这种方式不适合共享资源。为了解决共享资源的问题,我们可以使用 Hapi 插件机制,在 server 上注册一个插件,该插件负责创建和管理资源。这样,我们就可以在多个地方共享同一个资源了。
示例代码
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ----------- - ------------------------------- ----- -------- - - ----- ------------ --------- ----- -------- -------- -- - ----- -- - ----- ------------------------------------------------------ ------------- - -------------- - -- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- -------------------------- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - ----- -- - ---------------------- ----- ----- - ----- ---------------------------------------- ------ ------ - --- ----- --------------- ------------------- ------- -- ---- ----------------- -- -------------------------------- ----- -- - ----------------- ---------------- --- -------展开代码
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676b675e78388e33bb2245f4