Eklentiler
Bu kurs hapi v17 ile uyumludur
hapinin uygulamanı kolayca ayrıştırılmış (isolated) işletme mantığı ve tekrar kullanılabilir hizmetlere bölebileceğin kapsamlı ve güçlü bir eklenti sistemi bulunur.
Bir eklenti oluşturmak
Eklenti yazmak çok kolay. Aslında yalnızca register (kaydet) özelliği olan bir nesneler. Bu özellik ise async function (server, options) imzası olan bir işlev. Bir de zorunlu olan name (isim) özelliği ve versiyon gibi bir çok seçime bağlı özelliği var.
Çok basit bir eklenti şöyle görünür:
'use strict';
const myPlugin = {
name: 'myPlugin',
version: '1.0.0',
register: async function (server, options) {
// Örnek bir yol yaratalım
server.route({
method: 'GET',
path: '/test',
handler: function (request, h) {
return 'hello, world';
},
});
// vesaire...
await someAsyncMethods();
},
};Ya da harici bir modül olarak yazıldıklarında pkg özelliği belirleyebilirsin:
'use strict';
exports.plugin = {
pkg: require('./package.json'),
register: async function (server, options) {
// Örnek bir yol yaratalım
server.route({
method: 'GET',
path: '/test',
handler: function (request, h) {
return 'hello, world';
},
});
// vesaire...
await someAsyncMethods();
},
};Birinci örnekte name (isim) ve version (versiyon) özelliklerini açıkça belirtirken ikinci örnekte pkg özelliğini içeriği package.json olacak şekilde gönderdiğimize dikkat et. İki şekilde de çalışır.
Bir modül olarak yazıldığında, bir eklenti ya üst seviye bir modül çıktısı örn: module.exports = { register, name, version } ya da modülün bir hapi eklentisinden fazlasını çıkartsın istersen exports.plugin = { register, name, version } olabilir.
Ayrıca, eklenti nesnesi değeri true olan bir multiple (çoklu) özelliği içererek hapiye bu eklentinin bir sunucuya birden fazla kez kaydedilmesinin güvenilir olduğunu söyleyebilir.
Kullanılabilir bir diğer özellik ise oncetır (bir kez). true olarak ayarlandığında mükerrer kayıtlar hapi tarafından hata fırlatmaksızın görmezden gelinecektir.
Kaydetme (register) Yontemi
Yukarıda gördüğümüz üzere, register (kaydet) yöntemi iki değiştirge kabul eder: server ve options.
options (seçenekler) değiştirgesi basitçe kullanıcının server.register(plugin, options) yöntemini çağırırken eklentine gönderdiği seçeneklerdir. Nesne olduğu gibi yazdığın register(kaydet) yöntemine gönderilir.
register, eklentinin kaydedilmesi için gerekli adımlar tamamlandıktan sonra async (asenkron) olarak sonuç dönen bir işlev olmalıdır. Alternatif olarak eklentin, eğer kayıt işlemi sırasında bir sorun oluşursa hata fırlatmalıdır.
server (sunucu) nesnesi eklentinin kurulduğu sunucuya bir referanstır.
Bir eklentiyi yüklemek
Eklentiler server.register() yöntemiyle tek tek ya da bir grup olarak bir dizinin içinde yüklenebilir. Örneğin:
const start = async function () {
// bir eklenti yükle
await server.register(require('myplugin'));
// birden fazla eklenti yükle
await server.register([require('myplugin'), require('yourplugin')]);
};Eklentine seçenekler göndermek için, bunun yerine plugin (eklenti) ve options (seçenekler) anahtarlarıyla birer nesne gönderiyoruz. Mesela:
const start = async function () {
await server.register({
plugin: require('myplugin'),
options: {
message: 'hello',
},
});
};Bu nesneler bir dizi içinde de gönderilebilir:
const start = async function () {
await server.register([
{
plugin: require('plugin1'),
options: {},
},
{
plugin: require('plugin2'),
options: {},
},
]);
};Kayit secenekleri
server.register()a isteğe bağlı ikinci bir değiştirge de gönderebilirsin. Bu nesnenin dokümantasyonu API referansında bulunabilir.
Seçenekler nesnesi hapi tarafından klentinin yüklendiği yollara (route) vhost ya da prefix değiştirgeçlerini göndermen için kullanılır ve yüklenen eklentilerle paylaşılmaz.
Farzı mahal şöyle bir eklentimiz olsun:
'use strict';
exports.plugin = {
pkg: require('./package.json'),
register: async function (server, options) {
server.route({
method: 'GET',
path: '/test',
handler: function (request, h) {
return 'test passed';
},
});
// vesaire...
await someAsyncMethods();
},
};Normalde bu eklenti yüklendiğinde /teste bir GET yolu oluşturur. Ancak seçeneklerdeki prefix (ön ek) ayarı kullanılarak bu eklenti içerisinde oluşturulan tüm yollara belirli bir ön ek eklenebilir:
const start = async function () {
await server.register(require('myplugin'), {
routes: {
prefix: '/plugins',
},
});
};prefix (ön ek) seçeneği sebebiyle artık bu eklenti yüklendiğinde GET yolu (route) /plugins/test olarak oluşacak.
Aynı şekilde options.routes.vhost özelliği yüklenen eklentiler tarafından oluşturulan tüm yollara (route) varsayılan bir sanal sunucu vhost atar. vhost ayarı hakkında daha fazla bilgi API referansında bulunabilir.