装饰器

如果想为 Fastify 实例添加功能,可以使用 decorate 方法。

decorate允许向 Fastify 实例添加新属性。可以是一个值、一个函数,也可以是一个对象或一个字符串。

使用方法

decorate
只需要调用 decorate 函数,并且传入新属性的键和值即可。

fastify.decorate('utility', () => {
  // something very useful
})

可以定义一个不是函数的实例:

fastify.decorate('conf', {
  db: 'some.db',
  port: 3000
})

一旦定义了这个实例,可以通过传入的参数名称来得到该值:

fastify.utility()

console.log(fastify.conf.db)

装饰器不可以重新被覆盖,如果要定义一个已经存在的装饰器,decorate 将会抛出异常。

decorateReply
decorateReply 可以为 Reply 核心对象添加新属性。

fastify.decorateReply('utility', function () {
  // something very useful
})

注意:使用箭头函数会将 this 绑定到 Fastify 的 reply 实例。

decorateRequest
decorateRequest 可以为 Request 核心对象添加新属性。

fastify.decorateRequest('utility', function () {
  // something very useful
})

注意:使用箭头函数会将 this 绑定到 Fastify 的 request 实例。

extendServerError
如果要扩展 服务器错误,可以使用此 API,必须传入一个返回值为对象的函数,该函数将接收原始的 Error 对象,并返回新Error 对象来扩展服务器错误。

fastify.extendServerError((err) => {
  return {
    timestamp: new Date()
  }
})

/*
  The resulting object will be:
  {
    error: String
    message: String
    statusCode: Number
    timestamp: Date
  }
*/

同步和异步

decorate 是一个 同步 的 API。如果需要添加一个具有异步引导的装饰器,Fastify会在你的装饰器准备好之前启动。如果要解决这个问题,必须使用 register API 结合 fastify-plugin 来解决。学习更多关于 插件

依赖

如果一个装饰器依赖于另一个装饰器,可以将其他装饰器声明为依赖。只需要添加一个字符串数组(表示所依赖的装饰器的名称)作为第三个参数即可:

fastify.decorate('utility', fn, ['greet', 'log'])

如果不满足依赖关系,那么 decorate 会抛出一个异常,但是不用担心:依赖关系检查会在服务器启动之前执行,所以在运行时不会发生错误。

hasDecorator

可以使用 hasDecorator 检查装饰器是否存在:

fastify.hasDecorator('utility')

results matching ""

    No results matching ""