装饰器
如果想为 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
将会抛出异常。
decorateReplydecorateReply
可以为 Reply
核心对象添加新属性。
fastify.decorateReply('utility', function () {
// something very useful
})
注意:使用箭头函数会将 this
绑定到 Fastify 的 reply
实例。
decorateRequestdecorateRequest
可以为 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')