• home > webfront > server > Fastify >

    Fastify Getting-Started ,从插件开始

    Author:zhoulujun Date:

    在 JavaScript 中一切皆为对象,在 Fastify 中,一切都是插件 (plugin)。那么插件系统是如何工作呢?

    https://fastify.dev/docs/latest/Guides/Getting-Started/

    在 JavaScript 中一切皆为对象,在 Fastify 中,一切都是插件 (plugin)。

    register API,它是 Fastify 框架的核心,也是添加路由、插件等的唯一方法。

    register API

    register 创建一个新的 Fastify 上下文, 这意味着如果你对 Fastify 的实例做任何改动, 这些改动不会反映到上下文的父级上. 换句话说, 封装!

    件必须输出一个有以下参数的方法

    module.exports = function (fastify, options, done) {}


    fastify 就是封装的 Fastify 实例, options 就是选项对象, 而 done 是一个在插件准备好了之后必须要调用的方法.

    Fastify 的插件模型是完全可重入的和基于图(数据结构)的, 它能够处理任何异步代码并且保证插件的加载顺序, 甚至是关闭顺序! 如何做到的? 很高兴你发问了, 查看下 avvio! Fastify 在 .listen(), .inject() 或者 .ready() 被调用了之后开始加载插件.

    在插件里面你可以做任何想要做的事情, 注册路由, 工具方法 和进行嵌套的注册, 只要记住当所有都设置好了后调用

    插件与路由使用示例

    server.js

    import Fastify from 'fastify'
    import dbConnector from './our-db-connector'
    import firstRoute from './our-first-route'
    
    const fastify = Fastify({
      logger: true
    })
    fastify.register(dbConnector)
    fastify.register(firstRoute)
    
    fastify.listen(3000, function (err, address) {
      if (err) {
        fastify.log.error(err)
        process.exit(1)
      }
    })

    our-db-connector.js

    import fastifyPlugin from 'fastify-plugin'
    import fastifyMongo from 'fastify-mongodb'
    
    async function dbConnector (fastify, options) {
      fastify.register(fastifyMongo, {
        url: 'mongodb://localhost:27017/test_database'
      })
    }
    
    // 用 fastify-plugin 包装插件,以使插件中声明的装饰器、钩子函数暴露在根作用域里。
    module.exports = fastifyPlugin(dbConnector)

    our-first-route.js

    async function routes (fastify, options) {
      const collection = fastify.mongo.db.collection('test_collection')
    
      fastify.get('/', async (request, reply) => {
        return { hello: 'world' }
      })
    
      fastify.get('/animals', async (request, reply) => {
        const result = await collection.find().toArray()
        if (result.length === 0) {
          throw new Error('No documents found')
        }
        return result
      })
    
      fastify.get('/animals/:animal', async (request, reply) => {
        const result = await collection.findOne({ animal: request.params.animal })
        if (!result) {
          throw new Error('Invalid value')
        }
        return result
      })
    }
    
    module.exports = routes

    我们可以使用 register 来注册数据库连接器或者路由。 这是 Fastify 最棒的特性之一了!它使得插件按声明的顺序来加载,唯有当前插件加载完毕后,才会加载下一个插件。如此,我们便可以在第一个插件中注册数据库连接器,并在第二个插件中使用它。

    当调用函数 fastify.listen()、fastify.inject() 或 fastify.ready() 时,插件便开始加载了。

    MongoDB 的插件使用了 decorate API,以便在 Fastify 的命名空间下添加自定义对象,如此一来,你就可以在所有地方直接使用这些对象了。我们鼓励运用这一 API,因为它有助于提高代码复用率,减少重复的代码或逻辑。

    decorate API

    装饰器 API 允许自定义核心 Fastify 对象,例如服务器实例本身以及 HTTP 请求生命周期中使用的任何请求和响应对象。装饰器 API 可用于将任何类型的属性附加到核心对象,例如 函数、普通对象或原生类型。

    使用此 API 装饰核心对象允许底层 JavaScript 引擎优化服务器、请求和响应对象的处理。这是通过在实例化和使用所有此类对象实例之前定义它们的形状来实现的。

    用法

    具体参看 https://fastify.dev/docs/latest/Reference/Decorators/

    比如:

    fastify.decorate('db', new DbConnection())
    
    fastify.get('/', async function (request, reply) {
      // using return
      return { hello: await this.db.query('world') }
      
      // or
      // using reply.send()
      reply.send({ hello: await this.db.query('world') })
      await reply
    })





    转载本站文章《Fastify Getting-Started ,从插件开始》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/server/Fastify/9304.html