Next.js API Rotalarını kullanarak doğrudan Next.js uygulamanız içinde sunucusuz arka uçlar oluşturmayı öğrenin. Bu kılavuz, temel kurulumdan kimlik doğrulama, veri kalıcılığı ve daha fazlasını yönetmek için gelişmiş tekniklere kadar her şeyi kapsar.
Next.js API Rotaları: Backend'inizi Kolaylıkla Oluşturun
Next.js, güçlü özellikleri ve sezgisel yapısıyla ön uç (front-end) geliştirmede devrim yarattı. Peki, arka uç (backend) geliştirmeyi de önemli ölçüde basitleştirebildiğini biliyor muydunuz? Next.js API Rotaları, doğrudan Next.js uygulamanız içinde sunucusuz API uç noktaları oluşturmanıza olanak tanıyarak birçok durumda ayrı bir arka uç sunucusuna olan ihtiyacı ortadan kaldırır. Bu kapsamlı kılavuz, Next.js API Rotalarını kullanarak sağlam ve ölçeklenebilir bir arka uç oluşturma sürecinde size yol gösterecektir.
Next.js API Rotaları Nedir?
API Rotaları, Next.js projenizdeki /pages/api
dizini içinde oluşturduğunuz sunucusuz fonksiyonlardır. Bu fonksiyonlar, gelen HTTP isteklerini işler ve tıpkı geleneksel bir arka uç API'si gibi yanıtlar döndürür. Temel fark, sunucusuz fonksiyonlar olarak dağıtılmalarıdır, bu da sunucuları veya altyapıyı yönetmeniz gerekmediği anlamına gelir.
Bunları, Next.js ön ucunuzla sorunsuz bir şekilde entegre olan, hafif, isteğe bağlı arka uç fonksiyonları olarak düşünebilirsiniz.
Next.js API Rotalarını Kullanmanın Faydaları
- Basitleştirilmiş Geliştirme: Hem ön uç hem de arka uç kodunuzu aynı projede, JavaScript veya TypeScript kullanarak yazın. Farklı projeler ve teknolojiler arasında bağlam değiştirmeye son.
- Sunucusuz Mimari: Sunucusuz bilişimin ölçeklenebilirliği, güvenilirliği ve maliyet etkinliğinden yararlanın. Yalnızca tükettiğiniz kaynaklar için ödeme yapın.
- Kolay Dağıtım: Tüm uygulamanızı (ön uç ve arka uç) Vercel veya Netlify gibi platformları kullanarak tek bir komutla dağıtın.
- Dahili Güvenlik: Next.js ve sunucusuz platformlar, API uç noktalarınızı korumak için yerleşik güvenlik özellikleri sunar.
- Geliştirilmiş Performans: API Rotaları kullanıcılarınıza daha yakın konumlarda dağıtılabilir, bu da gecikmeyi azaltır ve performansı artırır; özellikle küresel kullanıcılar için faydalıdır.
- Kod Tekrar Kullanılabilirliği: Ön uç ve arka uç arasında kod paylaşarak kod tekrarını azaltın ve sürdürülebilirliği artırın.
Next.js API Rotalarına Başlarken
JSON yanıtı döndüren basit bir API rotası oluşturalım. Öncelikle, bir Next.js projesi kurduğunuzdan emin olun. Eğer yoksa, şunu kullanarak bir tane oluşturun:
npx create-next-app my-app
cd my-app
Şimdi, /pages/api
dizini içinde hello.js
adında bir dosya oluşturun:
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ name: 'John Doe' })
}
Bu kod, "John Doe" adını içeren bir JSON nesnesi ile yanıt veren basit bir API rotası tanımlar. Bu API rotasına erişmek için Next.js geliştirme sunucunuzu başlatın:
npm run dev
Ardından, tarayıcınızı açın ve http://localhost:3000/api/hello
adresine gidin. Aşağıdaki JSON yanıtını görmelisiniz:
{"name": "John Doe"}
API Rota İşleyicisini (Handler) Anlamak
API rotanızdaki handler
fonksiyonu iki argüman alır:
req
: Gelen istek hakkında istek metodu, başlıklar ve gövde gibi bilgileri içeren birhttp.IncomingMessage
örneğidir.res
: İstemciye bir yanıt göndermenizi sağlayan birhttp.ServerResponse
örneğidir.
Bu nesneleri farklı türdeki istekleri işlemek, istek gövdesinden veri okumak, yanıt başlıklarını ayarlamak ve farklı türlerde yanıtlar göndermek için kullanabilirsiniz.
Farklı HTTP Metotlarını İşleme
Gelen isteğin HTTP metodunu belirlemek ve farklı metotları buna göre işlemek için req.method
özelliğini kullanabilirsiniz. Örneğin:
// pages/api/method.js
export default function handler(req, res) {
if (req.method === 'GET') {
// GET isteğini işle
res.status(200).json({ message: 'Bu bir GET isteğidir' })
} else if (req.method === 'POST') {
// POST isteğini işle
res.status(200).json({ message: 'Bu bir POST isteğidir' })
} else {
// Diğer metotları işle
res.status(405).json({ message: 'Method Not Allowed' })
}
}
Bu örnekte, API rotası hem GET hem de POST isteklerini işler. İstek metodu GET ise, "Bu bir GET isteğidir" mesajını içeren bir JSON nesnesiyle yanıt verir. İstek metodu POST ise, "Bu bir POST isteğidir" mesajını içeren bir JSON nesnesiyle yanıt verir. İstek metodu başka bir şey ise, 405 Method Not Allowed hatasıyla yanıt verir.
İstek Gövdesinden Veri Okuma
POST, PUT ve PATCH istekleri için genellikle istek gövdesinden veri okumanız gerekir. Next.js, JSON ve URL kodlu istek gövdelerini ayrıştırmak için yerleşik destek sağlar. Bir JSON istek gövdesini ayrıştırmak için req.body
özelliğini kullanabilirsiniz. Örneğin:
// pages/api/post.js
export default async function handler(req, res) {
if (req.method === 'POST') {
const { name, email } = req.body
// Veriyi işle
console.log('İsim:', name)
console.log('E-posta:', email)
res.status(200).json({ message: 'Veri başarıyla alındı' })
} else {
res.status(405).json({ message: 'Method Not Allowed' })
}
}
Bu API rotasını test etmek için Postman veya curl gibi bir araç kullanarak JSON gövdeli bir POST isteği gönderebilirsiniz:
curl -X POST -H "Content-Type: application/json" -d '{"name": "Jane Doe", "email": "jane.doe@example.com"}' http://localhost:3000/api/post
Yanıt Başlıklarını Ayarlama
Yanıt başlıklarını ayarlamak için res.setHeader()
metodunu kullanabilirsiniz. Bu, içerik türünü, önbellek kontrolünü ve diğer önemli bilgileri ayarlamak için kullanışlıdır. Örneğin:
// pages/api/headers.js
export default function handler(req, res) {
res.setHeader('Content-Type', 'application/json')
res.setHeader('Cache-Control', 's-maxage=3600')
res.status(200).json({ message: 'Merhaba, dünya!' })
}
Bu örnekte, API rotası Content-Type
başlığını application/json
olarak ayarlar, bu da yanıtın bir JSON nesnesi olduğunu belirtir. Ayrıca Cache-Control
başlığını s-maxage=3600
olarak ayarlar, bu da tarayıcıya ve CDN'e yanıtı 1 saate kadar önbelleğe almasını söyler.
Hata Yönetimi
API rotalarınızda hataları zarif bir şekilde yönetmek önemlidir. İstisnaları yakalamak ve istemciye uygun hata yanıtları göndermek için try-catch bloklarını kullanabilirsiniz. Örneğin:
// pages/api/error.js
export default async function handler(req, res) {
try {
// Bir hata simüle et
throw new Error('Bir şeyler ters gitti')
} catch (error) {
console.error(error)
res.status(500).json({ message: 'Internal Server Error' })
}
}
Bu örnekte, API rotası yeni bir Error
nesnesi atarak bir hata simüle eder. Catch bloğu hatayı yakalar, konsola kaydeder ve istemciye 500 Internal Server Error yanıtı gönderir. Üretim ortamları için Sentry veya Datadog gibi sağlam bir kayıt sistemi kullanmayı düşünün.
Veritabanına Bağlanma
API rotaları için en yaygın kullanım durumlarından biri bir veritabanına bağlanmaktır. Next.js API Rotaları, aşağıdakiler de dahil olmak üzere çeşitli veritabanlarıyla sorunsuz bir şekilde entegre olur:
- MongoDB: Esnek ve yapılandırılmamış veriler için çok uygun olan popüler bir NoSQL veritabanı.
- PostgreSQL: Güvenilirliği ve veri bütünlüğü ile bilinen güçlü ve açık kaynaklı bir ilişkisel veritabanı.
- MySQL: Web uygulamaları için yaygın olarak kullanılan bir başka popüler açık kaynaklı ilişkisel veritabanı.
- Firebase: Gerçek zamanlı bir veritabanı ve diğer hizmetleri sağlayan bulut tabanlı bir platform.
- FaunaDB: Küresel uygulamalar için tasarlanmış sunucusuz bir veritabanı.
İşte bir Next.js API rotasında bir MongoDB veritabanına nasıl bağlanılacağına dair bir örnek:
// pages/api/mongodb.js
import { MongoClient } from 'mongodb'
const uri = process.env.MONGODB_URI
const options = {}
let client
let clientPromise
if (!process.env.MONGODB_URI) {
throw new Error('Lütfen Mongo URI\'nizi .env.local dosyasına ekleyin')
}
if (process.env.NODE_ENV === 'development') {
// Geliştirme modunda, değerin HMR (Hot Module Replacement)
// tarafından neden olunan modül yeniden yüklemeleri arasında korunması
// için küresel bir değişken kullanın.
if (!global._mongoClientPromise) {
client = new MongoClient(uri, options)
global._mongoClientPromise = client.connect()
}
clientPromise = global._mongoClientPromise
} else {
// Üretim modunda, küresel bir değişken kullanmamak en iyisidir.
client = new MongoClient(uri, options)
clientPromise = client.connect()
}
// Modül kapsamlı bir MongoClient promise'i dışa aktarın. Bunu ayrı
// bir modülde yaparak, istemci birden fazla
// fonksiyonda güvenle yeniden kullanılabilir. Bkz: https://github.com/vercel/next.js/blob/canary/examples/with-mongodb/lib/mongodb.js
export default async function handler(req, res) {
try {
const client = await clientPromise
const db = client.db(process.env.MONGODB_DB)
const collection = db.collection('users')
const users = await collection.find({}).toArray()
res.status(200).json({ users })
} catch (e) {
console.error(e)
res.status(500).json({ message: 'Kullanıcılar getirilemedi' })
}
}
Bu kodu çalıştırmadan önce, mongodb
paketinin kurulu olduğundan emin olun:
npm install mongodb
Ayrıca MONGODB_URI
ve MONGODB_DB
ortam değişkenlerini de ayarlamanız gerekir. Bu değişkenler .env.local
dosyanızda (veya üretim için barındırma sağlayıcınızın ortam değişkeni ayarlarında) tanımlanmalıdır. MONGODB_URI
, MongoDB veritabanınıza bağlantı dizesini içerir ve MONGODB_DB
veritabanı adını belirtir.
Kimlik Doğrulama ve Yetkilendirme
API rotalarınızı korumak güvenlik için çok önemlidir. Next.js API Rotaları, aşağıdakiler de dahil olmak üzere çeşitli kimlik doğrulama ve yetkilendirme teknikleri kullanılarak güvence altına alınabilir:
- JSON Web Tokens (JWT): Taraflar arasında bir JSON nesnesi olarak bilgiyi güvenli bir şekilde iletmek için bir standart.
- API Anahtarları: API uç noktalarınıza erişimi kısıtlamanın basit bir yolu.
- OAuth: Kullanıcıların kimlik bilgilerini paylaşmadan üçüncü taraf uygulamalara kaynaklarına erişim izni vermelerini sağlayan bir yetkilendirme protokolü.
- NextAuth.js: Next.js uygulamaları için eksiksiz bir açık kaynaklı kimlik doğrulama çözümü.
İşte bir API rotasını JWT kimlik doğrulaması kullanarak nasıl koruyacağınıza dair bir örnek:
// pages/api/protected.js
import jwt from 'jsonwebtoken'
const secret = process.env.JWT_SECRET
export default function handler(req, res) {
const token = req.headers.authorization?.split(' ')[1]
if (!token) {
return res.status(401).json({ message: 'Yetkisiz' })
}
try {
const decoded = jwt.verify(token, secret)
// "decoded" nesnesi, token içine gömülü kullanıcı bilgilerini içerir
// Örneğin: const userId = decoded.userId;
// İsteği işlemeye devam et
res.status(200).json({ message: 'Korunan kaynağa başarıyla erişildi' })
} catch (error) {
return res.status(401).json({ message: 'Geçersiz token' })
}
}
Bu kodu çalıştırmadan önce, jsonwebtoken
paketinin kurulu olduğundan emin olun:
npm install jsonwebtoken
Ayrıca JWT_SECRET
ortam değişkenini de ayarlamanız gerekir. Bu, JWT'leri imzalamak ve doğrulamak için kullanılan güçlü, rastgele oluşturulmuş bir gizli anahtar olmalıdır. Bunu güvenli bir şekilde saklayın ve asla istemci tarafı kodunuzda ifşa etmeyin.
Middleware (Ara Katman Yazılımı)
Next.js, API rotaları için Express.js gibi geleneksel bir middleware sunmasa da, API rota işleyicilerinizi yeniden kullanılabilir fonksiyonlarla sarmalayarak benzer işlevsellik elde edebilirsiniz. Bu, aşağıdaki gibi görevleri gerçekleştirmenize olanak tanır:
- Kimlik Doğrulama: API uç noktalarına erişime izin vermeden önce kullanıcı kimlik bilgilerini doğrulama.
- Yetkilendirme: Bir kullanıcının belirli bir eylemi gerçekleştirmek için gerekli izinlere sahip olup olmadığını kontrol etme.
- Kayıt Tutma (Logging): Denetim ve hata ayıklama amacıyla gelen istekleri ve giden yanıtları kaydetme.
- Doğrulama (Validation): İstek verilerinin belirli kriterleri karşıladığından emin olmak için doğrulama.
- Hız Sınırlama (Rate Limiting): Bir kullanıcının belirli bir zaman diliminde yapabileceği istek sayısını sınırlayarak API'nizi kötüye kullanımdan koruma.
İşte basit bir kayıt tutma middleware'i nasıl oluşturulacağına dair bir örnek:
// utils/middleware.js
export function withLogging(handler) {
return async function(req, res) {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`)
return handler(req, res)
}
}
Bu middleware'i kullanmak için, API rota işleyicinizi withLogging
fonksiyonuyla sarmalamanız yeterlidir:
// pages/api/logged.js
import { withLogging } from '../../utils/middleware'
async function handler(req, res) {
res.status(200).json({ message: 'Bu istek günlüğe kaydedildi' })
}
export default withLogging(handler)
Next.js API Rotaları Oluşturmak İçin En İyi Uygulamalar
- API rotalarınızı küçük ve odaklı tutun. Her API rotası belirli bir görevi veya kaynağı işlemelidir.
- Hassas veriler için ortam değişkenleri kullanın. Kodunuza asla gizli bilgileri veya API anahtarlarını yazmayın.
- Güvenlik açıklarını önlemek için istek verilerini doğrulayın. İstek gövdelerini doğrulamak için Joi veya Yup gibi bir kütüphane kullanın.
- Hataları zarif bir şekilde yönetin ve bilgilendirici hata mesajları sağlayın. Try-catch blokları kullanın ve hataları merkezi bir konuma kaydedin.
- Performansı artırmak için önbellekleme kullanın. Veritabanı yükünü azaltmak için sık erişilen verileri önbelleğe alın.
- API rotalarınızı performans ve hatalar için izleyin. API'nizin sağlığını izlemek için Sentry veya Datadog gibi bir izleme aracı kullanın.
- API rotalarınızı Swagger veya OpenAPI gibi bir araç kullanarak belgeleyin. Bu, diğer geliştiricilerin API'nizi kullanmasını kolaylaştırır.
- Tür güvenliği için TypeScript kullanmayı düşünün. TypeScript, hataları erken yakalamanıza ve kodunuzun sürdürülebilirliğini artırmanıza yardımcı olabilir.
- Uluslararasılaştırmayı (i18n) baştan düşünün. Uygulamanız farklı ülkelerden kullanıcılar tarafından kullanılacaksa, API rotalarınızı birden çok dili ve para birimini destekleyecek şekilde tasarlayın. Örneğin, e-ticaret için API uç noktalarının kullanıcının konumuna göre farklı vergi oranlarını ve kargo ücretlerini işlemesi gerekebilir.
- Uygun CORS (Cross-Origin Resource Sharing) yapılandırmasını uygulayın. Bu, API'nize Next.js uygulamanızdan farklı bir alan adından erişildiğinde çok önemlidir. API kaynaklarınıza yalnızca yetkili kaynakların erişmesine izin vermek için CORS'u dikkatlice yapılandırın.
Gelişmiş Teknikler
Arka Plan Görevleri
API yanıtını engellememesi gereken uzun süren görevler için arka plan görevleri kullanmayı düşünün. Arka plan görevlerinizi yönetmek ve bunları eşzamansız olarak işlemek için BullMQ veya Bree gibi kütüphaneler kullanabilirsiniz.
WebSockets
Gerçek zamanlı uygulamalar için Next.js API rotalarınızda WebSockets kullanabilirsiniz. Socket.IO ve ws gibi kütüphaneler, istemci ve sunucu arasında kalıcı bağlantılar kurmayı kolaylaştırır.
GraphQL
Veri çekmek için daha esnek ve verimli bir yola ihtiyacınız varsa, GraphQL kullanmayı düşünün. Next.js uygulamanızda bir GraphQL API uç noktası oluşturmak için Apollo Server veya Yoga gibi kütüphaneler kullanabilirsiniz.
Sonuç
Next.js API Rotaları, doğrudan Next.js uygulamanız içinde sunucusuz arka uçlar oluşturmak için güçlü ve kullanışlı bir yol sunar. Sunucusuz mimarinin avantajlarından yararlanarak geliştirmeyi basitleştirebilir, performansı artırabilir ve maliyetleri düşürebilirsiniz. İster basit bir iletişim formu ister karmaşık bir e-ticaret platformu oluşturuyor olun, Next.js API Rotaları kolaylıkla sağlam ve ölçeklenebilir bir arka uç oluşturmanıza yardımcı olabilir. Temel bilgileri sağlam bir şekilde anlayarak ve en iyi uygulamaları uygulayarak, verimli, güvenli ve küresel olarak erişilebilir uygulamalar oluşturmak için bu güçlü araçtan yararlanabilirsiniz.