Uygulama
app
nesnesi, tüm middleware'leri, handler'ları ve ayarları ile birlikte tinyhttp uygulamasını temsil eder.
import { App } from '@tinyhttp/app'
const app = new App()
app.get('/', (req, res) => {
res.send('merhaba dünya')
})
app.listen(3000)
App nesnesinin aşağıdakiler için yöntemleri vardır:
- HTTP isteği yönlendirme; örneğin,
app.METHOD
. - Middleware yapılandırma;
app.route
bölümüne bakın. - HTML görünümlerini render etme;
app.render
bölümüne bakın. - Bir şablon motoru kaydetme;
app.engine
bölümüne bakın.
Tinyhttp uygulama nesnesine, isteği nesnesi ve yanıt nesnesi üzerinden req.app
ve res.app
olarak referans verilebilir.
Yapıcı
noMatchHandler(req, res)
Rotalardan hiçbiri eşleşmezse çağrılan handler. 404 Not Found döndürmelidir.
import { App, Request, Response } from '@tinyhttp/app'
const app = new App({
noMatchHandler: (req: Request, res: Response) =>
void res.status(404).end('Bulunamadı :('),
})
app
.get('/', (req, res) => {
res.send('merhaba dünya')
})
.listen(3000)
onError(err, req, res)
Sunucu hatalarını yakalamak için bir middleware. Hata herhangi bir şey olabilir. 500 Internal Server Error döndürmelidir.
import { App, Request, Response } from '@tinyhttp/app'
const app = new App({
onError: (err, req, res) => {
res.status(500).send({
message: err.message,
})
},
})
app.get('/', (req, res) => void res.send('merhaba dünya')).listen(3000)
applyExtensions
Handler benzeri bir fonksiyon, handler'lara istek ve yanıt uzantıları ekler. Varsayılan olarak, tüm tinyhttp'nin req
/ res
uzantılarını içeren extendMiddleware
fonksiyonu kullanılır.
import { App, extendMiddleware } from '@tinyhttp/app'
const app = new App({
applyExtensions: (req, res, next) => {
extendMiddleware(req, res, next)
res.someExt = someExt(req, res, next)
},
})
Boş bir fonksiyon geçirildiğinde, extendMiddleware
'dan tüm uzantılar dahil edilmeyecektir.
import { App } from '@tinyhttp/app'
import { send } from '@tinyhttp/send'
const app = new App({
applyExtensions: (req, res, next) => {
// artık tinyhttp sadece `res.send` uzantısına sahip
res.send = send(req, res)
},
})
Ayrıca tüm uzantıları devre dışı bırakmak için boş bir fonksiyon geçirilebilir:
import { App } from '@tinyhttp/app'
const app = new App({
applyExtensions: (req, res, next) => {
next()
},
})
settings
tinyhttp uygulaması, çeşitli uygulama parçalarını açıp kapatmak için bir ayarlar listesi içerir. Tüm ayarlar varsayılan olarak devre dışıdır ve en iyi performansı sağlamak için (daha az uzantı, daha iyi performans) tasarlanmıştır.
import { App } from '@tinyhttp/app'
const app = new App({
settings: {
networkExtensions: true,
},
})
app.use((req, res) => void res.send(`Hostname: ${req.hostname}`)).listen(3000)
Tüm ayarların listesi:
networkExtensions
- ağreq
uzantılarısubdomainOffset
-req.subdomains
için alt alan adı ofsetibindAppToReqRes
- mevcutApp
'ireq.app
veres.app
ile ilişkilendirxPoweredBy
-X-Powered-By: "tinyhttp"
başlığını ayarlaenableReqRoute
-req.route
özelliğini etkinleştirviews
- şablonların bulunduğu görünüm diziniview
- şablon motoru renderleme mantığını yönetmek için özel Görünüm nesnesiview cache
- görünümlerin önbelleğe alınmasını aç/kapaview engine
- varsayılan motor uzantısı (örn.eta
)
networkExtensions
Ağ ile ilgili İstek nesnesi uzantılarının bir listesini etkinleştirir.
req.protocol
req.secure
req.hostname
req.ip
req.ips
req.subdomains
subdomainOffset
req.subdomains
için alt alan adı ofseti. Varsayılan değeri 2
dir.
bindAppToReqRes
Uygulamayı req.app
ve res.app
ile ilişkilendirmek için referans olarak bağlar. Varsayılan olarak devre dışıdır.
enableReqRoute
req.route
özelliğini etkinleştirir. Varsayılan olarak devre dışıdır.
Özellikler
app.locals
app.locals
nesnesi, uygulama içinde yerel değişkenlerdir.
console.dir(app.locals.title)
// => 'My App'
console.dir(app.locals.email)
// => 'me@myapp.com'
Ayarlanınca, app.locals
özelliklerinin değerleri uygulama ömrü boyunca geçerlidir, buna karşın res.locals
özellikleri yalnızca isteğin ömrü için geçerlidir.
Uygulama içinde render edilen şablonlarda yerel değişkenlere erişebilirsiniz. Bu, şablonlara yardımcı işlevler sağlamak ve uygulama düzeyindeki verileri sağlamak için yararlıdır.
app.locals.title = 'My App'
app.locals.strftime = require('strftime')
app.locals.email = 'me@myapp.com'
app.parent
app.parent
, bir üst App
nesnesine işaret eder, örneğin, bağlandığı uygulama.
const app = new App()
const subapp = new App()
app.use(subapp)
console.log(app.parent)
/*
<ref *1> App {
middleware: [],
mountpath: '/',
apps: {
'/': App {
middleware: [],
mountpath: '/',
apps: {},
parent: [Circular *1]
}
}
}
*/
Yöntemler
app.METHOD
Bir HTTP isteğini yönlendirir; METHOD, istek HTTP yöntemidir (GET, PUT, POST vb.) küçük harfle yazılır. Gerçek yöntemler app.get(), app.post(), app.put() ve benzerleridir.
app.all
Bu yöntem, standart app.METHOD()
yöntemleri gibidir ancak tüm HTTP fiillerini eşleştirir.
Aşağıdaki geri çağırma, /secret
yoluna yapılan GET, POST, PUT, DELETE veya herhangi bir HTTP isteği yöntemiyle eşleşince çalışacaktır:
app.all('/secret', (req, res, next) => {
console.log('Gizli bölüme erişiliyor...')
next() // kontrolü bir sonraki handler'a geçir
})
app.all()
yöntemi, belirli yol önekleri veya keyfi eşleşmeler için "küresel" bir mantığı eşlemek için yararlıdır. Örneğin, tüm diğer rota tanımlarından önce aşağıdaki kodu koyarsanız, bu noktadan itibaren tüm rotaların kimlik doğrulamasını gerektirmesini zorunlu kılacak ve otomatik olarak bir kullanıcı yükleyecektir. Bu geri çağırmaların son nokta olarak hareket etmesi gerekmiyor: loadUser bir işlevi yerine getirebilir, sonra bir sonraki rotaları eşleştirmeye devam etmek için next()
çağırabilir.
app.all('*', requireAuthentication, loadUser)
app.get
HTTP GET isteklerini belirtilen yola belirtilen handler fonksiyonlarıyla yönlendirir.
app.get('/', (req, res) => {
res.send(`${req.method || 'GET'} ana sayfasına istek`)
})
app.post
HTTP POST isteklerini belirtilen yola belirtilen handler fonksiyonlarıyla yönlendirir.
app.post('/', (req, res) => {
res.send(`${req.method || 'POST'} ana sayfasına istek`)
})
app.put
HTTP PUT isteklerini belirtilen yola belirtilen handler fonksiyonlarıyla yönlendirir.
app.put('/', (req, res) => {
res.send(`${req.method || 'PUT'} ana sayfasına istek`)
})
app.delete
HTTP DELETE isteklerini belirtilen yola belirtilen handler fonksiyonlarıyla yönlendirir.
app.delete('/', (req, res) => {
res.send(`${req.method || 'DELETE'} ana sayfasına istek`)
})
app.use
Belirtilen middleware fonksiyonu veya fonksiyonlarını belirtilen yolda monte eder: middleware fonksiyonu, istenen yolun tabanında yol ile eşleştiğinde çalıştırılır.
Bir rota, yolundan hemen sonra gelen herhangi bir yolu eşleştirecektir. Örneğin: app.use('/apple', ...)
yolu /apple
, /apple/images
, /apple/images/news
gibi yolları eşleştirir.
Yol varsayılan olarak /,
olduğu için, yol olmadan monte edilen middleware, uygulama için her istek için çalıştırılacaktır. Örneğin, bu middleware fonksiyonu uygulama için her istekte çalıştırılacaktır:
app.use((req, res, next) => {
console.log('Zaman: %d', Date.now())
next()
})
Middleware fonksiyonları sıralı olarak çalıştırılır; bu nedenle, middleware ekleme sırası önemlidir.
// bu middleware isteğin geçmesine izin vermeyecektir
app.use((req, res, next) => void res.send('Merhaba Dünya'))
// istekler bu rotaya asla ulaşmayacaktır
app.get('/', (req, res) => void res.send('Hoş geldiniz'))
app.engine
Bir şablon motoru kaydeder. renderFile
fonksiyonu içeren herhangi bir Express şablon motoru ile çalışır.
import { App } from '@tinyhttp/app'
import { renderFile } from 'eta'
const app = new App()
app.engine('eta', renderFile) // app.engines['eta']'yı `renderFile` ile eşleştir
app.render
Eta v2 tinyhttp ile en iyi şekilde çalışır. Eta v3 ile motoru kaydetmeye gerek yoktur, şablonları bir
Eta
örneği kullanarak render etmelisiniz.
Daha önce app.engine
aracılığıyla ayarlanan motor ile bir dosyayı render eder. Sonucu render edip yanıtlamak için res.render
kullanın.
import { App } from '@tinyhttp/app'
import { renderFile } from 'eta'
const app = new App()
app.engine('eta', renderFile)
app.render(
'index',
{ name: 'Eta' },
{
/* bazı seçenekler */
},
(err, html) => {
if (err) throw err
doSomethingWithHTML(html)
}
)
Tinyhttp henüz app.render
aşırı yüklemelerini desteklemiyor. Bu nedenle, bazı motorlar (örneğin Pug) ilave sarma gerektirebilir.
import { App } from '@tinyhttp/app'
import pug from 'pug'
const app = new App()
const renderPug = (path, _, options, cb) => pug.renderFile(path, options, cb)
app.engine('pug', renderPug)
app.use((_, res) => void res.render('index.pug'))
app.listen(3000, () => console.log(`http://localhost:3000 üzerinde dinleniyor`))
app.path
Uygulamanın mountpath'ini döndürür.
const app = new App()
const blog = new App()
const blogAdmin = new App()
app.use('/blog', blog)
blog.use('/admin', blogAdmin)
console.dir(app.path()) // ''
console.dir(blog.path()) // '/blog'
console.dir(blogAdmin.path()) // '/blog/admin'
app.route
Tek bir rota örneği döndürür; ardından HTTP fiilleriyle optional middleware'yi işlemek için kullanabilirsiniz. Aynı rota isimlerinin tekrarını önlemek için app.route()
kullanın.
new App()
.route('/events')
.all((req, res, next) => {
// tüm HTTP fiilleri için önce çalışıyor
// bunu rota özel middleware olarak düşünün!
})
.get((req, res, next) => res.json({ hello: 'world' }))
.post((req, res, next) => {
// belki yeni bir etkinlik ekleyin...
})
app.enable
Boolean
ayar adını true
olarak ayarlar; ad, uygulama ayarlarından birinin özelliğidir.
app.enable('networkExtensions')
app.disable
Boolean
ayar adını false
olarak ayarlar; ad, uygulama ayarlarından birinin özelliğidir.
app.disable('networkExtensions')
app.set
Ayar adını değere ayarlar; değeri uygulama ayarlarından birinin özelliğidir.
app.set('subdomainOffset', 2)
app.handler
req
/ res
nesnelerini uzatır, 404 ve 500 handler'larını ekler, middleware'i dağıtır ve yolları eşleştirir.
Sunucuyu başlatmanıza gerek olmayan bazı durumlarda req
/ res
handler'ını geçirebilirsiniz.
Örneğin, HTTP bir sunucusu yerine bir HTTP/2 sunucusu başlatmak isterseniz:
import { App } from '@tinyhttp/app'
import type { Request, Response } from '@tinyhttp/app'
import fs from 'fs'
import { createSecureServer } from 'http2'
const app = new App()
const options = {
key: fs.readFileSync('localhost-privkey.pem'),
cert: fs.readFileSync('localhost-cert.pem'),
}
app.get(
'/',
(req, res) => void res.send(`HTTP ${req.httpVersion} sunucusundan merhaba!`)
)
createSecureServer(options, async (req: Request, res: Response) => {
await app.handler(req, res)
}).listen(3000)
Ayrıca, handler'ı sunucusuz işlevlerde (örneğin, Vercel) geçirmekte yaygındır, şu şekilde:
const { App } = require('@tinyhttp/app')
app.use((req, res) => void res.send(`${req.url} adresindesiniz`))
module.exports = async (req, res) => await app.handler(req, res)
app.listen
Belirtilen bir port ve host üzerinde bir HTTP sunucusu başlatır ve dinler.
import { App } from '@tinyhttp/app'
const app = new App()
app
.use((_, res) => void res.send('Merhaba Dünya'))
.listen(3000, () => console.log(`:3000 üzerinde başlatıldı`))