如何创建您自己的 Fastify 插件

Fastify 是一个高效的 Node.js Web 框架,其插件系统十分灵活。通过 Fastify 插件,我们可以轻松地扩展框架功能,实现更多复杂的业务逻辑。本文将深入探讨如何创建自己的 Fastify 插件。

准备工作

在开始编写插件之前,我们需要先了解 Fastify 的插件系统。Fastify 提供了一个快速、灵活的插件系统,插件开发必备的模块如下:

const fp = require('fastify-plugin')

其中 fp 模块是最常用的插件声明和导出方式。

基本の插件

让我们从最基本的插件开始。我们可以使用 fp 创建一个简单的插件:

module.exports = fp((fastify, opts, next) => {
  fastify.decorate('myPlugin', () => {
    return 'Hello World!'
  })

  next()
})

这个插件只是给 fastify 这个对象上加入了一个新的 myPlugin 成员方法。这个成员方法只是简单返回一个字符串 “Hello World!”。

插件参数

在上面的例子中,我们看到了 opts 参数,这个参数可以让我们在插件中传入自定义的参数配置。比如,我们可以传入一个方法。

module.exports = fp((fastify, opts, next) => {
  const { prefix } = opts

  fastify.decorate('myPlugin', () => {
    return `Hello World! ${prefix}`
  })

  next()
})

这样插件就可以接收包含 prefix 的参数,返回值也将包含该参数。

异步插件

Fastify 插件支持异步操作。通过使用 asyncawait,我们可以编写异步的插件代码。例子如下:

module.exports = fp(async (fastify, opts) => {
  const pluginOpts = opts || {}

  const db = await MongoClient.connect(pluginOpts.url)

  fastify.decorate('mongo', db.db(pluginOpts.dbName))

  fastify.addHook('onClose', async (instance, done) => {
    await db.close()
    done()
  })
})

可以看到,这个插件使用了异步的 MongoDB 连接方法,并且在关闭 Fastify 实例时,将 MongoDB 连接关闭。

插件生命周期

除了异步插件之外,Fastify 还支持插件生命周期。插件生命周期可以在插件注册前或者插件销毁之后触发,我们可以在这些时间点执行自己的逻辑。

module.exports = fp((fastify, opts, next) => {
  fastify.addHook('onRoute', (routeOptions) => {
    console.log(`route ${routeOptions.method} ${routeOptions.url} is constructed.`)
  })

  next()
})

这个插件就是在所有的路由注册结构之前输出日志。我们还可以编写一些其他的生命周期钩子,例如 onRegisteronReadyonClose

其他高级插件特性

除了上面提到的插件生命周期和插件参数之外,Fastify 还提供了很多其他的高级插件特性。比如:

  • 强制插件依赖其他插件
  • 插件作用域,保证不同插件之间的方法名不会发生冲突
  • 插件卸载

更多插件的内容,请见官方文档

总结

本文简要介绍了 Fastify 的插件系统,并使用示例代码具体说明了如何编写自己的 Fastify 插件。希望读者可以借此了解到 Fastify 的插件系统,并开始运用它们来解决具体业务问题。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65af86f8add4f0e0ff8f9069