Express.js Rehberi: Modern Web Uygulamaları ve API Geliştirme
Yazar: Burak Balkı | Kategori: Database | Okuma Süresi: 9 dk
Express.js dünyasına kapsamlı bir giriş yapın. Bu rehber, Node.js tabanlı bu popüler framework'ün kurulumunu, routing mekanizmalarını, middleware yapısını ve...
## Express.js Nedir ve Neden Tercih Edilmelidir?
**Express.js**, Node.js platformu üzerine inşa edilmiş, minimal ve esnek bir web uygulama çatısıdır (framework). Modern web geliştirme ekosisteminde, sunucu tarafı uygulamaları ve **RESTful API**'ler oluşturmak için endüstri standardı olarak kabul edilir. Express, Node.js'in karmaşık HTTP modülünü soyutlayarak, geliştiricilere daha temiz, okunabilir ve sürdürülebilir bir kod yapısı sunar.
Express.js'in tercih edilme nedenlerinin başında **performans** ve **modülerlik** gelir. Minimalist yapısı sayesinde uygulamaya sadece ihtiyaç duyulan özellikler eklenir, bu da gereksiz yükten kaçınmayı sağlar. Ayrıca, devasa bir ekosisteme (middleware) sahip olması, veritabanı entegrasyonundan güvenlik protokollerine kadar her türlü ihtiyacın hızlıca çözülmesine olanak tanır.
## Express.js Kurulumu ve Proje Yapılandırması
Bir Express.js projesine başlamak için sisteminizde Node.js ve npm'in (Node Package Manager) kurulu olması gerekir. Proje klasörünüzü oluşturduktan sonra aşağıdaki adımları izleyerek temel yapılandırmayı gerçekleştirebilirsiniz.
```bash
# Proje dizini oluşturma ve giriş
mkdir express-rehberi && cd express-rehberi
# package.json oluşturma
npm init -y
# Express kurulumu
npm install express
```
Projenin ana giriş dosyası olan `app.js` veya `index.js` dosyasını oluşturarak en temel sunucuyu ayağa kaldırabiliriz:
```javascript
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.send('Express.js Sunucusu Çalışıyor!');
});
app.listen(PORT, () => {
console.log(`Sunucu http://localhost:${PORT} adresinde aktif.`);
});
```
## Temel Yönlendirme (Routing) Mekanizmaları
**Routing**, bir uygulamanın uç noktalarının (URI) istemci isteklerine (GET, POST, PUT, DELETE) nasıl yanıt vereceğini belirleme sürecidir. Express, bu süreci oldukça sezgisel bir hale getirir.
### HTTP Metotları ve Kullanımı
```javascript
// GET İsteği: Veri okuma
app.get('/api/users', (req, res) => {
res.json({ message: "Kullanıcı listesi getirildi." });
});
// POST İsteği: Yeni veri oluşturma
app.post('/api/users', (req, res) => {
res.status(201).json({ message: "Kullanıcı oluşturuldu." });
});
// PUT İsteği: Mevcut veriyi güncelleme
app.put('/api/users/:id', (req, res) => {
const { id } = req.params;
res.json({ message: `${id} ID'li kullanıcı güncellendi.` });
});
// DELETE İsteği: Veri silme
app.delete('/api/users/:id', (req, res) => {
res.json({ message: "Kullanıcı silindi." });
});
```
## Middleware (Ara Yazılım) Kavramı ve Kullanımı
**Middleware**, istek (request) ve yanıt (response) döngüsü arasında çalışan fonksiyonlardır. Express'in kalbi middleware yapısıdır. Bir middleware fonksiyonu; isteği değiştirebilir, yanıtı sonlandırabilir veya döngüyü bir sonraki fonksiyona (`next()`) aktarabilir.
### Özel Bir Middleware Oluşturma
```javascript
const loggerMiddleware = (req, res, next) => {
console.log(`${new Date().toISOString()} - ${req.method} : ${req.url}`);
next(); // Bir sonraki middleware'e geçişi sağlar
};
app.use(loggerMiddleware);
```
### Built-in ve Third-party Middleware
Express ile gelen `express.json()` gömülü bir middleware iken, `cors` veya `helmet` gibi paketler dış kaynaklı (third-party) middleware örnekleridir.
```javascript
app.use(express.json()); // JSON gövdelerini ayrıştırmak için
app.use(express.static('public')); // Statik dosyaları sunmak için
```
## Express.js ile Veritabanı Entegrasyonu
Express.js, veritabanı bağımsızdır; yani hem SQL (PostgreSQL, MySQL) hem de NoSQL (MongoDB, Redis) veritabanları ile mükemmel uyum sağlar.
### MongoDB ve Mongoose Kullanımı
```javascript
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/express_db', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('MongoDB bağlantısı başarılı'))
.catch(err => console.error('Bağlantı hatası:', err));
```
### PostgreSQL ve Sequelize Kullanımı
```javascript
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'postgres'
});
async function testDB() {
try {
await sequelize.authenticate();
console.log('PostgreSQL bağlantısı kuruldu.');
} catch (error) {
console.error('Bağlantı başarısız:', error);
}
}
```
## Hata Yönetimi ve Debugging Stratejileri
Profesyonel bir Express uygulamasında hatalar merkezi bir noktadan yönetilmelidir. Express, dört parametreli özel hata yakalama middleware'lerini tanır.
```javascript
// Merkezi hata yakalayıcı
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({
status: 'error',
message: err.message || 'Bir iç sunucu hatası oluştu.'
});
});
```
## Güvenlik ve Kimlik Doğrulama (Authentication)
Web uygulamalarında güvenlik en kritik unsurdur. Express.js projelerinde **JWT (JSON Web Token)** kullanımı oldukça yaygındır.
```javascript
const jwt = require('jsonwebtoken');
const authMiddleware = (req, res, next) => {
const token = req.header('Authorization');
if (!token) return res.status(401).send('Erişim engellendi.');
try {
const verified = jwt.verify(token, process.env.TOKEN_SECRET);
req.user = verified;
next();
} catch (err) {
res.status(400).send('Geçersiz Token');
}
};
```
> **Önemli Not:** Uygulamanızı yayına almadan önce `helmet` paketini kullanarak HTTP başlıklarını güvenli hale getirmeyi unutmayın.
## Performans Optimizasyonu ve Ölçeklenebilirlik
Express uygulamalarınızın yüksek trafik altında stabil kalması için şu teknikleri uygulayabilirsiniz:
| Teknik | Açıklama | Araç |
| :--- | :--- | :--- |
| **Gzip Sıkıştırma** | Yanıt boyutlarını küçültür. | `compression` |
| **Caching** | Sık erişilen verileri bellekte tutar. | `Redis` |
| **Load Balancing** | Yükü birden fazla işleme dağıtır. | `PM2 Cluster Mode` |
| **Rate Limiting** | Kötü niyetli istekleri sınırlar. | `express-rate-limit` |
## MVC Mimarisi ve Kod Organizasyonu
Büyük projelerde spagetti koddan kaçınmak için **MVC (Model-View-Controller)** yapısı kullanılmalıdır.
- **Models:** Veri yapısı ve veritabanı şemaları.
- **Views:** Kullanıcı arayüzü (API projelerinde genelde JSON yanıtları).
- **Controllers:** İş mantığının (business logic) bulunduğu yer.
- **Routes:** URL yönlendirmelerinin tanımlandığı yer.
```javascript
// routes/userRoutes.js
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');
router.get('/', userController.getAllUsers);
module.exports = router;
```
## Sık Yapılan Hatalar
1. **Next() Fonksiyonunu Unutmak:** Middleware zincirinde `next()` çağrılmazsa istek askıda kalır.
2. **Hata Yakalamama:** Async/Await bloklarında `try-catch` kullanmamak uygulamanın çökmesine neden olur.
3. **Güvenlik İhmali:** `.env` dosyalarını git'e pushlamak ve hassas verileri açıkta bırakmak.
4. **Bloklayıcı İşlemler:** Node.js tek iş parçacıklı (single-threaded) olduğu için CPU yoğunluklu işlemleri ana döngüde yapmak performansı öldürür.
## Sık Sorulan Sorular
1. **Express.js öğrenmek için Node.js bilmek şart mı?**
Evet, Express bir Node.js çatısı olduğu için temel Node.js kavramlarına ve JavaScript asenkron yapısına hakim olmanız gerekir.
2. **Express.js ile hangi veritabanı daha iyidir?**
Bu projenin ihtiyacına bağlıdır. Hızlı prototipleme için MongoDB, ilişkisel ve karmaşık veriler için PostgreSQL önerilir.
3. **Body-parser kullanmam gerekiyor mu?**
Express 4.16.0 sürümünden itibaren `express.json()` ve `express.urlencoded()` gömülü olarak geldiği için harici body-parser paketine gerek kalmamıştır.
4. **Express.js büyük ölçekli projeler için uygun mu?**
Evet, doğru mimari (Microservices veya iyi yapılandırılmış Monolith) ve PM2 gibi araçlarla çok büyük yükleri kaldırabilir.
5. **NestJS mi Express mi?**
Express daha esnek ve minimaldir. NestJS ise daha kuralcı, TypeScript tabanlı ve kurumsal mimari odaklıdır.
## Özet ve Sonuç
Express.js, hızı, esnekliği ve geniş topluluk desteği ile modern web dünyasının vazgeçilmez bir parçasıdır. Bu rehberde temel kurulumdan veritabanı entegrasyonuna, güvenlikten performans optimizasyonuna kadar kritik noktaları ele aldık. Doğru middleware kullanımı ve MVC yapısıyla birleştiğinde, Express ile ölçeklenebilir ve yüksek performanslı uygulamalar geliştirmek oldukça verimlidir.