1. Hazırlık
- Node.js (≥12) ve npm kurulu.
express,dotenv,corspaketleri eklenmiş.
Bash:
npm init -y
npm install express dotenv cors
2. Proje Dizinleri
Kod:
- app.js
- tenants/
├─ tenantA.json
└─ tenantB.json
- routes/
└─ index.js
tenants/* dosyalarında her kiracının ayarları (veritabanı bağlantısı, API key, vb.) saklanır.3. Ortam Değişkenleri
.env içinde:
Kod:
PORT=3000
DEFAULT_TENANT=tenantA
4. Tenant Middleware
app.js içinde tenant belirleyici middleware oluşturulur:
JavaScript:
const fs = require('fs');
const path = require('path');
app.use((req, res, next) => {
const subdomain = req.headers.host.split('.')[0]; // example: tenantA.domain.com
const tenantFile = path.join(__dirname, 'tenants', `${subdomain}.json`);
if (fs.existsSync(tenantFile)) {
req.tenantConfig = JSON.parse(fs.readFileSync(tenantFile));
} else {
req.tenantConfig = JSON.parse(fs.readFileSync(path.join(__dirname, 'tenants', process.env.DEFAULT_TENANT + '.json')));
}
next();
});
Bu, her istek geldiğinde ilgili kiracının konfigürasyonunu alır.
5. Route’lar
routes/index.js içinde kiraca özgü rotalar tanımlanır ve tenant veri bağlamı kullanılır:
JavaScript:
const express = require('express');
const router = express.Router();
router.get('/data', (req, res) => {
// tenantConfig içinde veritabanı adı vb. var
res.json({ tenant: req.tenantConfig.name, message: 'Veri çekildi.' });
});
module.exports = router;
app.js’e ekle:
JavaScript:
const router = require('./routes');
app.use('/', router);
6. Her Kiracının Veritabanı
- Ayrı veritabanı isimleri:
tenantA_db,tenantB_db. - Bağlantı sırasında
req.tenantConfig.dbNamekullanılabilir.
7. Yayınlama
node app.js komutu ile başlat.- Test için
http://tenantA.localhost:3000/datavehttp://tenantB.localhost:3000/data.
Sık Karşılaşılan Takılma Noktaları
| Sorun | Çözüm |
|---|---|
| CORS hatası | cors() middleware’i ekleyin, origin ayarın. |
| Ortam değişkeni yok | .env dosyası oluşturulmuş mu kontrol edin. |
| Tenant dosyası bulunamadı | Default tenant ayarı (DEFAULT_TENANT) tanımlanmalı. |
Soru: Çok kiracılı yapı içinde oturum yönetimini tenant bazlı hâle getirirken hangi yöntemi tercih edersiniz? (örn. JWT ile tenant id eklemek, session)