Ana içeriğe geç

Ana Kavramlar

Uygulama

Bir tinyhttp uygulaması, middleware ve yönlendirici (router) yöntemlerini içeren bir App sınıfının bir örneğidir.

import { App } from '@tinyhttp/app'

const app = new App()

app.use((req, res) => void res.send('Merhaba Dünya'))

app.listen(3000)

App seçenekleri bir kurucu içinde ayarlanabilir.

const app = new App({
noMatchHandler: (req, res) => void res.send('Oopsie, sayfa bulunamadı'),
})

Middleware

Middleware, Express'teki gibi isteği yönetmek için bir işleyici fonksiyonu ve isteğe bağlı olarak bir yol içeren bir nesnedir.

app
.use((req, _res, next) => {
console.log(` ${req.url} adresinden bir istek yapıldı!`)
next()
})
.use((_req, res) => void res.send('Merhaba Dünya'))

İşleyici

İşleyici, Request ve Response nesnesini argüman olarak alan bir fonksiyondur. Bu nesneler, yerleşik http'nin IncomingMessage ve ServerResponse nesnelerinin genişletilmiş versiyonlarıdır.

app.use((req, res) => {
res.send({ query: req.query })
})

Asenkron işleyiciler

tinyhttp, Express'ten farklı olarak, asenkron fonksiyonları işleyici olarak destekler. Bir promise tarafından atılan herhangi bir hata, üst düzey try...catch ile yakalanır; bu da, eğer gerekmediyse kendi try...catch bloğunuzu oluşturmanıza gerek kalmaz.

import { App } from '@tinyhttp/app'
import { readFile } from 'node:fs/promises'

app.use('/', async (req, res, next) => {
const file = await readFile('file.txt') // hata durumunda 500 ile hata mesajı gönderir
res.send(file)
})

Yol

İstek URL'si belirtilen yol ile başlarsa, işleyici istek ve yanıt nesnelerini işler. Middleware yalnızca belirtilen yol ile başlayan URL'leri işleyebilir. Gelişmiş yollar (parametreli ve tam eşleşmeli) için Routing bölümüne gidin.

app.use('/', (_req, _res, next) => void next()) // Tüm yolları işleyecek
app.use('/path', (_req, _res, next) => void next()) // /path ile başlayan yolları işleyecek

path argümanı isteğe bağlıdır (varsayılan olarak /dır), bu yüzden işleyici fonksiyonunuzu app.use'in ilk argümanı olarak koyabilirsiniz.

Zincirleme

tinyhttp uygulaması, herhangi bir app.use çağrısında kendisini döndürür, bu da zincirleme yapmamıza olanak tanır:

app.use((_) => {}).use((_) => {})

app.get gibi yönlendirme fonksiyonları da zincirlemeyi destekler.

Çalışma sırası

Tüm middleware bir döngü içinde çalıştırılır. Bir middleware işleyicisi next() çağırdığında, tinyhttp bir sonraki middleware'e geçer ve döngü sona erene kadar devam eder.

app
.use((_, res) => res.end('Merhaba Dünya'))
.use((_, res) => res.end('Ben ulaşılamayan middleware\'im'))

Middleware zincirlerinde next() çağırdığınızdan emin olun, çünkü aksi takdirde mevcut işleyicide kalır ve bir sonraki işleyiciye geçmez.

Routing

Routing uygulamanızın belirli yollar (örn. / veya /test) ve yöntemler (GET, POST vb.) kullanarak istekleri nasıl yöneteceğini tanımlamaktır.

Her yönelge, istek URL'si ile eşleştiğinde devreye giren bir veya daha fazla middleware'e sahip olabilir.

Yönlendirmeler genellikle aşağıdaki yapıya sahiptir:

app.METHOD(path, handler, ...handlers)

Burada app, tinyhttp App örneğidir, path, isteğin URL'si ile eşleşmesi gereken yoldur ve handler (+ handlers), belirtilen yollar istek URL'si ile eşleştiğinde yürütülen bir fonksiyondur.

import { App } from '@tinyhttp/app'

const app = new App()

app.get('/', (_req, res) => void res.send('Merhaba Dünya'))

Yönlendirme fonksiyonları

En popüler yöntemler (örn. GET, POST, PUT, OPTIONS) yönlendirme için önceden tanımlanmış fonksiyonlara sahiptir. tinyhttp'nin ileriki sürümlerinde tüm yöntemler için kendi fonksiyonları olacaktır.

app
.get('/', (_req, res) => void res.send('Merhaba Dünya'))
.post('/a/b', (req, res) => void res.send('Bir POST isteği gönderildi'))

Tüm HTTP yöntemlerini işlemek için app.all kullanın:

app.all('*', (req, res) =>
res.send(` ${req.url} adresine ${req.method} yöntemiyle bir istek yapıldı`)
)

Yönlendirme yolları

Yönlendirme yolları, bir istek yöntemi ile birleştiğinde, isteğin yapılabileceği uç noktaları tanımlar. Yönlendirme yolları dizeler, dize kalıpları veya düzenli ifadeler (henüz değil) olabilir.

tinyhttp, yönlendirme eşleşmesi için bir regexparam modülü kullanır. Yönlendirme kalıpları hakkında daha fazla bilgi için README'sine bakın.

Sonuçta, istek URL'sindeki son ? sembolünden sonra gelen sorgu dizeleri yoldan çıkarılır.

Bu yönlendirme yolu, kök yönlendirmeye, /'ya gelen istekleri eşleştirecektir.

app.get('/', function (req, res) {
res.send('kök')
})

Bu yönlendirme yolu, /about'a gelen istekleri eşleştirecektir.

app.get('/about', function (req, res) {
res.send('hakkında')
})

Bu yönlendirme yolu, /random.text'e gelen istekleri eşleştirecektir.

app.get('/random.text', (req, res) => void res.send('random.text'))

Bu yönlendirme yolu, acd ve abcd'yi eşleştirecektir.

app.get('/ab?cd', (req, res) => void res.send('ab?cd'))

Yönlendirme parametreleri

Yönlendirme parametreleri, URL'deki pozisyonlarına göre belirtilen değerleri yakalamak için kullanılan adlandırılmış URL segmentleridir. Yakalanan değerler, req.params nesnesinde yer alır ve yol parametresinin adını anahtar olarak kullanır.

Yönlendirme yolu: /users/:userId/books/:bookId
İstek URL'si: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }

Yol parametreli yönlendirmeleri tanımlamak için, yalnızca yolun içinde yönlendirme parametrelerini belirtin:

app.get('/users/:userId/books/:bookId', (req, res) => void res.send(req.params))

Yönlendirme işleyicileri

Bir isteği yönetmek için middleware gibi davranan birden fazla geri çağırma fonksiyonu sağlayabilirsiniz. Tek istisna, bu geri çağırmaların kalan yönlendirme geri çağırmalarını atlamak için next()'i çağırabilmesidir. Bu tekniği, artık mevcut middleware'de kalmaya gerek kalmadığında, middleware'i koşullu olarak değiştirmek veya atlamak için kullanabilirsiniz.

Yönlendirme işleyicileri, bir fonksiyon veya bir liste halinde olabilir, aşağıdaki örneklerdeki gibi.

Tek bir geri çağırma fonksiyonu bir yönlendirmeyi işleyebilir. Örneğin:

app.get('/example/a', (req, res) => void res.send('A\'dan Merhaba!'))

Birden fazla geri çağırma fonksiyonu bir yönlendirmeyi işleyebilir ( next fonksiyonunu belirtmeyi unutmayın). Örneğin:

app.get(
'/example/b',
(req, res, next) => {
console.log('yanıt bir sonraki fonksiyon tarafından gönderilecek ...')
next()
},
(req, res) => void res.send('B\'dan Merhaba!')
)

Bir liste geri çağırma fonksiyonu bir yönlendirmeyi işleyebilir. Örneğin:

const cb0 = (req, res, next) => {
console.log('Geri çağırma bir!')
next()
}

const cb1 = (req, res, next) => {
console.log('Geri çağırma iki!')
next()
}

const cb2 = (req, res) => void res.send('Geri çağırma üçten Merhaba!')

app.get('/example/c', cb0, cb1, cb2)

Alt uygulamalar

tinyhttp'nin App'ini kullanarak, bir grup işleyiciyi modüler hale getirerek başka bir "ana" uygulamaya bağlayabilirsiniz.

Her uygulamanın kendi middleware, ayarlar ve yerelleri vardır. Şu anda destek deneyseldir ve muhtemelen beklendiği gibi çalışmayacaktır (tüm senaryolar test edilmedi), ancak yine de denemeyi deneyebilirsiniz:

import { App } from '@tinyhttp/app'

const app = new App()

const subApp = new App()

subApp.get(
'/route',
(req, res) => void res.send(` ${subApp.mountpath} adresinden Merhaba!`)
)

app.use('/subapp', subApp).listen(3000)

// localhost:3000/subapp/route "Hello from /subapp" gönderecek

Hata yönetimi

Asenkron middleware'lerdeki hatalar tinyhttp tarafından yönetilir ancak belirli bir hatayı yönetmek için kendi try...catch'ınızı ekleyebilirsiniz. Ancak, merkezi bir onError işleyicisini kullanmanız önerilir.

import { App } from '@tinyhttp/app'
import { readFile } from 'fs/promises'

const app = new App({
// Özel hata işleyici
onError: (err, _req, res) => {
console.log(err)
res.status(500).send(`Kötü bir şey oldu`)
},
})

app
.get('/', async (_, res, next) => {
const file = await readFile(`var olmayan dosya`)
res.send(file.toString())
})
.listen(3000, () => console.log('http://localhost:3000 adresinde başladı'))

Şablon motorları

v0.2.70'ten itibaren tinyhttp, şablon motorları için temel destek sağlamaktadır. v2.2'den itibaren, görünüm motoru express ile daha iyi uyumluluk için yeniden tasarlandı.

Eta v2 tinyhttp ile en iyi çalışmaktadır. Eta v3 ile motoru kaydetmeye gerek yoktur, şablonları bir Eta örneği kullanarak render etmelisiniz.

Bir motor kullanmak için, öncelikle onu belirli bir uzantı için kaydetmelisiniz.

import { App } from '@tinyhttp/app'
import eta from 'eta'

const app = new App()

app.engine('eta', eta.renderFile) // app.engines['eta']'yı eta.renderFile fonksiyonuna eşler

Ayrıca, varsayılan bir motor ayarlayabilirsiniz (bu, tüm şablonlar için varsayılan olarak kullanılacaktır):

app.set('view engine', 'eta')

Ve artık herhangi bir şablon dosyasını res.render yöntemi kullanarak render etmek mümkün:

import { App } from '@tinyhttp/app'
import eta from 'eta'
import type { PartialConfig } from 'eta/dist/types/config' // `res.render`'ın şablon motoru ayar türünü miras almasını sağlar

const app = new App()

app.engine('eta', eta.renderFile)

app.use(
(_, res) => void res.render<PartialConfig>('index.eta', { name: 'Eta' })
)

app.listen(3000, () => console.log(`http://localhost:3000'da dinliyor`))

Gelişmiş yapılandırma için özelleştirilmiş görünüm ve eta örneklerine başvurun.