Fastify
Fastify
Encapsulation
Fastify'in temel özelliklerinden biri "kapsülleme bağlamı"dır. Kapsülleme bağlamı, hangi decorators
, kayıtlı hooks
ve plugins
'lerin routes
için mevcut olduğunu yönetir. Kapsülleme bağlamının görsel temsili aşağıdaki şekilde gösterilmektedir:
Yukarıdaki şekil, birkaç varlığı içermektedir:
- kök bağlam
- Üç kök eklentisi
- Her bir çocuk bağlam için iki çocuk bağlam
- İki çocuk eklentisi
- Her bir torun bağlamı için bir torun bağlamı
- Üç çocuk eklentisi
Her çocuk bağlam ve torun bağlamı, kök eklentilerine erişebilir. Her çocuk bağlam içinde, torun bağlamları içindeki çocuk eklentilerine sahipken, içindeki çocuk bağlam kendi torun bağlamı içindeki çocuk eklentilerine erişemez.
Not: Fastify içinde her şey bir
plugin
olduğundan apart, kök bağlam tüm bu örnekteki her "bağlam" ve "eklentinin" bir eklenti olduğunu düşünelim ve bu eklenti decorator, hook, plugin ve route'ları kapsayabilir.
Dolayısıyla bu örneği somut terimlerle açıklamak gerekirse, üç route'a sahip bir REST API sunucusunu düşünün: ilk route (/one
) kimlik doğrulaması gerektiriyor, ikinci route (/two
) gerektirmiyor ve üçüncü route (/three
) ikinci route ile aynı bağlama erişiminin olduğu. Kimlik doğrulaması sağlamak için @fastify/bearer-auth kullanarak, bu örneğin kodu aşağıdaki gibidir:
'use strict'
const fastify = require('fastify')()
fastify.decorateRequest('answer', 42)
fastify.register(async function authenticatedContext (childServer) {
childServer.register(require('@fastify/bearer-auth'), { keys: ['abc123'] })
childServer.route({
path: '/one',
method: 'GET',
handler (request, response) {
response.send({
answer: request.answer,
// request.foo publicContext içerisinde tanımlı olduğu için tanımsız olacaktır
foo: request.foo,
// request.bar torun bağlamında tanımlı olduğu için tanımsız olacaktır
bar: request.bar
})
}
})
})
fastify.register(async function publicContext (childServer) {
childServer.decorateRequest('foo', 'foo')
childServer.route({
path: '/two',
method: 'GET',
handler (request, response) {
response.send({
answer: request.answer,
foo: request.foo,
// request.bar torun bağlamında tanımlı olduğu için tanımsız olacaktır
bar: request.bar
})
}
})
childServer.register(async function grandchildContext (grandchildServer) {
grandchildServer.decorateRequest('bar', 'bar')
grandchildServer.route({
path: '/three',
method: 'GET',
handler (request, response) {
response.send({
answer: request.answer,
foo: request.foo,
bar: request.bar
})
}
})
})
})
fastify.listen({ port: 8000 })
Yukarıdaki sunucu örneği, orijinal diyagramda belirtilen tüm kapsülleme kavramlarını göstermektedir:
- Her çocuk bağlam (
authenticatedContext
,publicContext
, vegrandchildContext
) kök bağlamda tanımlanananswer
istek decorator'ına erişebilir. - Sadece
authenticatedContext
,@fastify/bearer-auth
eklentisine erişim sağlar. - Hem
publicContext
hem degrandchildContext
,foo
istek decorator'ına erişebilir. - Sadece
grandchildContext
,bar
istek decorator'ına erişebilir.
Bunu görmek için sunucuyu başlatın ve istek gönderin:
## curl -H 'authorization: Bearer abc123' http://127.0.0.1:8000/one
{"answer":42}
# curl http://127.0.0.1:8000/two
{"answer":42,"foo":"foo"}
# curl http://127.0.0.1:8000/three
{"answer":42,"foo":"foo","bar":"bar"}
Sharing Between Contexts
Önceki örnekte her bağlamın yalnızca ebeveyn bağlamlardan miras aldığını unutmayın. Ebeveyn bağlamlar, alt bağlamlarındaki varlıklara erişemez. Bu varsayılan durum bazen istenmeyebilir. Bu gibi durumlarda, kapsülleme bağlamı, fastify-plugin kullanılarak kırılabilir; böylece alt bağlamda kayıtlı olan her şey içerideki ebeveyn bağlamına erişilebilir.
Eğer publicContext
, önceki örnekteki grandchildContext
içinde tanımlanan bar
decorator'ına erişim gerektiriyorsa, kod şu şekilde yeniden yazılabilir:
'use strict'
const fastify = require('fastify')()
const fastifyPlugin = require('fastify-plugin')
fastify.decorateRequest('answer', 42)
// `authenticatedContext` açıklık için çıkarıldı
fastify.register(async function publicContext (childServer) {
childServer.decorateRequest('foo', 'foo')
childServer.route({
path: '/two',
method: 'GET',
handler (request, response) {
response.send({
answer: request.answer,
foo: request.foo,
bar: request.bar
})
}
})
childServer.register(fastifyPlugin(grandchildContext))
async function grandchildContext (grandchildServer) {
grandchildServer.decorateRequest('bar', 'bar')
grandchildServer.route({
path: '/three',
method: 'GET',
handler (request, response) {
response.send({
answer: request.answer,
foo: request.foo,
bar: request.bar
})
}
})
}
})
fastify.listen({ port: 8000 })
Sunucuyu yeniden başlatıp /two
ve /three
için istekleri yenileyin:
# curl http://127.0.0.1:8000/two
{"answer":42,"foo":"foo","bar":"bar"}
# curl http://127.0.0.1:8000/three
{"answer":42,"foo":"foo","bar":"bar"}