Sunucu yöntemleri
Bu kurs hapi v17 ile uyumludur
Sunucu yöntemleri birden fazla yerde kullanılan modüllerin lazım olan her talep edilmesindense sunucu nesnene iliştirebildiğin kullanışlı bir yol sunar. Bir sunucu yöntemi kaydetmek için server.method() çağrısı yap. Bu yöntemi çağırmanın iki farklı yöntemi var. server.method(name, method, [options]) imzasıyla çağırabilirsin. Örneğin:
const add = function (x, y) {
return x + y;
};
server.method('add', add, {});server.method(method) imzasıyla da çağırabilirsin. Burada method (yöntem) name (isim), method (yöntem) ve options (seçenekler) değiştirgelerine sahip bir nesnedir (Ayrıca bu nesnelerden oluşan bir dizi de gönderebilirsin).
const add = function (x, y) {
return x + y;
};
server.method({
name: 'add',
method: add,
options: {},
});Isim
name (isim) değiştirgesi daha sonra sunucudan yöntemi server.methods[name] yöntemi ile çağırmak için kullanılacak bir metindır. Eğer name (isim) değiştirgesini bir . (nokta) karakteri ile gönderirsen; bir metin yerine aşağıda olduğu gibi iç içe bir nesne olarak kaydedilir.
server.method('math.add', add);Bu sunucu yöntemi server.methods.math.add() ile çağrılır.
Islev
method (yöntem) değiştirgesi yöntem çağrısı yapıldığında gerçekten çağırılacak olan işlevdir. İstediği kadar argüman alabilir. async (asenkron) bir fonksiyon olabilir. Örneğin:
const add = async function (x, y) {
const result = await someLongRunningFunction(x, y);
return result;
};
server.method('add', add, {});Sunucu yöntem işlevin geçerli bir sonuç dönmeli ya da bir hata oluştu ise fırlatmalıdır.
Onbellekleme
Sunucu yöntemlerinin başlıca avantajlarından biri hapinin ana önbelleklemesini geliştirebilmeleridir. Varsayılan olarak önbellekleme yapmaz ancak yöntem kaydedilirken geçerli bir yapılandırma verildiğinde dönen sonuç önbelleklenecek ve her çağrıldığında yöntemini tekrar çalıştırmak yerine önbellekten sunulacaktır. Yapılandırma şuna benzer:
server.method('add', add, {
cache: {
expiresIn: 60000,
expiresAt: '20:30',
staleIn: 30000,
staleTimeout: 10000,
generateTimeout: 100,
},
});değiştirgelerin anlamları:
expiresIn: öğe son kez önbelleklendiği andan itibaren süresinin dolması için geçmesi gereken milisaniye cinsinden süre.expiresAtile birlikte kullanılamaz.expiresAt: Yol (route) ile ilgili önbelleklerin süresinin dolması için 24 saatlik gösterimle 'HH:MM' formatında ifade edilen günün saati. Yerel zamanı kullanır.expiresInile birlikte kullanılamaz.staleIn: Önbellekteki bir öğenin bayat olarak işaretlenerek yeniden oluşturmaya kalkışmadan önce geçmesi gerek milisaniye cinsinden süre. En azexpiresInkadar olmalıdır.staleTimeout: Bayatlamış bir öğeyi dönmeden önce generateFunc oluşturma fonksiyonunun taze bir değer üretmesi için beklenilecek maksimum süre.generateTimeout: Bir değeri üretmek uzun sürdüğünde zaman aşımı hatası vermeden önce beklenecek milisaniye cinsinden süre. Değer gerçekten döndüğünde gelecek istekler için önbelleklenir.segment: Önbellek öğelerini ayrıştırmak (isolate) için kullanılan isteğe bağlı bölme adıcache: Sunucuda kullanılmak için yapılandırılmış bir önbellek bağlantı adını taşıyan isteğe bağlı bir metin
Önbellekleme hakkında daha fazla bilgi catbox dokümantasyonu ve API referansında bulunabilir.
Bir sunucu yönteminin her bir çağrı sonucunun ttl (time-to-live (yaşanacak zaman))inin üzerine ttl bayrağını ayarlayarak yazabilirsiniz. Önceki örnekte bu nasıl olurdu bir bakalım:
const add = async function (x, y, flags) {
const result = await someLongRunningFunction(x, y);
flags.ttl = 5 * 60 * 1000; // 5 mins
return result;
};
server.method('add', add, {
cache: {
expiresIn: 2000,
generateTimeout: 100,
},
});
server.methods.add(5, 12);Burada sunucu yöntem işlevimizi normalde göndermeyi planladığımızdan bir fazla değiştirge alacak şekilde tanımlayarak hapi tarafından gönderilecek flags (bayraklar) değiştirgesine yer açtık. Daha sonra ttl bayrağının üzerine sonucun (milisaniye cinsinden) ne kadar önbelleklenmesini istiyorsak onu yazdık. Eğer yazdığımız değer 0 olsaydı bu değer asla önbelleklenmeyecekti. Eğer bayrak ayarlamasaydık önbellek yapılandırmasındaki ttl kullanılacaktı.
Ozel bir anahtar uretmek
Yukarıdaki seçeneklere ek olarak, yöntemine gönderilen değiştirgeleri kullanarak önbellek anahtarı üretmek için kullanılacak özel bir işlev de tanımlayabilirsin. Eğer yöntemin yalnızca metin, sayı ve mantıksal içeriyorsa hapi senin için akıllı bir anahtar üretecektir. Ancak yönteminin değiştirgesi bir nesneyse önbellek anahtarını üretecek aşağıdaki gibi bir işlem sağlaman gerekir:
const sum = function (array) {
let total = 0;
array.forEach((item) => {
total += item;
});
return total;
};
server.method('sum', sum, {
generateKey: (array) => array.join(','),
});Yöntemine gönderdiğin tüm argümanlar generateKey yöntemi tarafından kullanılabilir.
Bagla (bind)
Sunucu yöntemine gönderilen son isteğe bağlı yöntem bind (bağla)dır. bind seçeneği yöntem içerisinde geçerli olan this (bu) kapsamını değiştirir. Varsayılan olarak bu yöntem eklendiği andaki aktif kapsamdır. Bu özellik kullanılarak, ayrıca bir değiştirge olarak gönderilen veritabanı istemcisi sebebiyle bir de generateKey (anahtar üret) işlevi tanımlama sorununu ortadan kaldırabilir. Örneğin:
const lookup = async function (id) {
// myDB.getOne çağrısı yapar
return await this.getOne({ id });
};
server.method('lookup', lookup, { bind: myDB });