Node.js, JavaScript kodunu bir tarayıcının dışında çalıştırmanıza izin veren, chrome’un v8 motoru üzerine kurulu açık kaynaklı bir JavaScript çalışma zamanıdır.

Çerçeve Kullanmadan NodeJS API Nasıl Oluşturulur?

Olay modeli, ekosistemi ve hızı, Node.js’yi sunucu tarafı uygulamalar için en çok aranan ve kullanılan çalışma zamanlarından biri haline getirdi.

Çoğu Node.js API sunucusu, Express veya başka bir çerçeve kullanır. Ancak, sadece birkaç adımda çerçevesiz basit bir Node.js API’si de oluşturabilirsiniz.

1. Adım: Geliştirme Ortamınızı Ayarlama

Aşağıdakileri çalıştırarak bir proje dizini ve cd oluşturun :

mkdir nodejs-api

cd nodejs-api

Ardından, aşağıdakileri çalıştırarak projenizde npm’yi başlatın:

npm init -y

Bu CRUD API’si, bir NoSQL veritabanı olan MongoDB’nin ve onun popüler ODM’si olan mongoose’un kullanımını içerecektir.

Mongoose’u yüklemek için aşağıdaki komutu çalıştırın :

npm install mongoose

Ardından, projenizin kök dizininde bir server.js dosyası oluşturun ve bir sunucu oluşturmak için aşağıdaki kod bloğunu ekleyin:

const http = require(“http”);

const server = http.createServer((req, res) => {});

server.listen(3000, () => {

  console.log(`Server is running`);

});

Bu kod bloğu, bir çekirdek Node.js modülü olan http modülünü içe aktarır. http modülü, Node.js’nin HTTP üzerinden veri aktarmasına izin verir. Bu modül, bir sunucu oluşturmak için gereken yöntemleri içerir.

Ardından, bir sunucu örneği oluşturan ve döndüren http modülünün createServer yöntemini çağırır. createServer yöntemi, parametre olarak bir istek ve yanıt nesnesi olan bir geri çağırma işlevi alır .

Ardından kod , döndürülen sunucu örneğinde dinleme yöntemini çağırır. Bu, sunucunun verilen bağlantı noktasındaki trafiği dinlemeye başlamasını sağlar. Listen yöntemi, başarılı olduğunda ikinci argüman olan bir geri arama başlatır .

Son olarak, projenizin kök dizininde route ve model adında iki dizin oluşturun . Rotalar klasörü, API’niz için yönlendirme mantığını içerecek, model ise veritabanıyla ilgili her şeyi içerecektir.

Adım 2: Uygulamanızı Bir Veritabanına Bağlama

server.js’de mongoose’u içe aktarın :

const mongoose = require(“mongoose”);

Mongoose’da connect yöntemini çağırın ve MongoDB URI’nizi argüman olarak iletin:

mongoose.connect(“MongoDB_URI”)

3. Adım: Bir API Modeli Oluşturma

Basit bir blog uygulaması için bir CRUD API oluşturun. Modeller klasörünüzde bir blogModel.js dosyası oluşturun ve dosyanıza aşağıdaki kodu ekleyin:

const mongoose = require(“mongoose”);

const blogSchema = mongoose.Schema({

  title: {

    type: String,

    required: [true, “Blog must have a title”],

  },

  body: {

    type: String,

    required: [true, “Blog must have a body”],

  },

});

module.exports = mongoose.model(“Blog”, blogSchema);

Yukarıdaki kod bloğu, iki özelliğe sahip bir firavun faresi modeli oluşturur ve bunları bir MongoDB veritabanına eşler.

Bu modeldeki her iki özelliğin de gerekli olarak true olarak ayarlanmış bir String türü vardır . Bir istek gövdesi özelliklerden herhangi birini içermiyorsa, eşlik eden hata mesajları görüntülenecektir.

Son satır, mongoose üzerinde model yöntemini çağırarak bir firavun faresi modeli oluşturur ve dışa aktarır . Model adını ( Blog ) ilk argüman olarak ve bir şemayı ( blogSchema ) ikinci argüman olarak iletin.

Adım 4: Uygulamanızda Yönlendirmeyi Uygulama

Express gibi çerçevelerin yardımı olmadan, API’nize yapılan her isteği işlemek için mantığı manuel olarak oluşturmanız gerekir.

Önce, rotalar klasörünüzde bir blogRoutes.js dosyası oluşturun , ardından blog modelini içe aktarın:

const Blog = require(“../models/blogModel”);

Ardından, eşzamansız bir yönlendirici işlevi oluşturun, req ve res parametre olarak iletin ve işlevi dışa aktarın:

const router = async function (req, res) {};

module.exports = router;

Bu işlev, tüm yönlendirme mantığınızı içerecektir.

Ardından, yönlendirme mantığını rotaya göre uygulayacaksınız.

Rotaları ALIN

/api/blogs öğesine yapılan istekler için GET rota işleyicisini uygulamak için aşağıdaki kod bloğunu yönlendirici işlevinize ekleyin :

//  GET: /api/blogs

if (req.url === “/api/blogs” && req.method === “GET”) {

    // get all blogs

    const blogs = await Blog.find();

    // set the status code and content-type

    res.writeHead(200, { “Content-Type”: “application/json” });

    // send data

    res.end(JSON.stringify(blogs));

}

Yukarıdaki kod bloğu , istek nesnesinin url ve yöntem özelliklerini kontrol eder. Daha sonra firavun faresi modelindeki ( Blog ) find yöntemiyle tüm blogları veritabanından getirir .

Ardından, yanıt nesnesi olan res üzerinde writeHead yöntemini çağırır. Bu yöntem, üç argüman verilen bir yanıt başlığı gönderir: bir durum kodu, isteğe bağlı bir durum mesajı ve başlıklar. 200 durum kodu başarılı bir yanıtı temsil eder ve bu API çağrısı için içerik türü application/json olarak ayarlanır .

Son olarak, res üzerinde end yöntemini çağırarak sunucunun askıda kalmamasını sağlamak için isteği kapatın . JSON.stringify çağrısı , blogs nesnesini bir JSON dizesine dönüştürür ve bunu bitiş yöntemine geçirmek, onu yanıt gövdesi olarak döndürür.

Tek bir kaynak için GET rota işleyicisini uygulamak için aşağıdaki kod bloğunu yönlendirici işlevinize ekleyin :

// GET: /api/blogs/:id

if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === “GET”) {

    try {

        // extract id from url

        const id = req.url.split(“/”)[3];

        // get blog from DB

        const blog = await Blog.findById(id);

        if (blog) {

            res.writeHead(200, { “Content-Type”: “application/json” });

            res.end(JSON.stringify(blog));

        } else {

            throw new Error(“Blog does not exist”);

        }

    } catch (error) {

        res.writeHead(404, { “Content-Type”: “application/json” });

        res.end(JSON.stringify({ message: error }));

    }

}

Bu kod, url’nin şu biçimle eşleşip eşleşmediğini kontrol etmek için bir regex ifadesini argüman olarak alan eşleşme yöntemini kullanır: /api/blogs/<number> .

Ardından, split yöntemini çağırarak url dizesinden id özelliğini çıkarın . Bu yöntem, argüman ( / ) olarak bir desen alır , dizgiyi desene göre böler ve bir dizi döndürür. Bu dizinin üçüncü öğesi id’dir .

Son olarak, eşleşen kimliğe sahip belgeyi veritabanınızdan alın. Varsa , 200 yanıt kodunu gönderin , isteği kapatın ve alınan blogu gönderin. Mevcut değilse, bir hata atın ve onu catch bloğunda yanıt olarak gönderin.

POST Rotası

POST yol işleyicisini uygulamak için aşağıdaki kod bloğunu yönlendirici işlevinize ekleyin :

// POST: /api/blogs/

if (req.url === “/api/blogs” && req.method === “POST”) {

    try {

        let body = “”;

        // Listen for data event

        req.on(“data”, (chunk) => {

            body += chunk.toString();

        });

        // Listen for end event

        req.on(“end”, async () => {

            // Create Blog

            let blog = new Blog(JSON.parse(body));

            // Save to DB

            await blog.save();

            res.writeHead(200, { “Content-Type”: “application/json” });

            res.end(JSON.stringify(blog));

        });

    } catch (error) {

        console.log(error);

    }

}

İstek nesnesi, Node.js ReadableStream arabirimini uygular. Bu akış , istek gövdesinden verilere erişmenizi sağlayan bir veri ve bir bitiş olayı yayar .

Bu kod, data olayını dinler ve onu bir dizgeye dönüştürerek ve onu body değişkenine birleştirerek işler. Son olay işleyicisinde, ayrıştırılmış gövde dizesiyle bir Blog örneği oluşturur . Ardından yeni blogu kaydeder, durum kodunu ve içerik başlığını gönderir ve isteği kapatır.

PUT Rotası

PUT rota işleyicisini uygulamak için aşağıdaki kod bloğunu yönlendirici işlevinize ekleyin :

// PUT: /api/blogs/:id

if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === “PUT”) {

    try {

        // extract id from url

        const id = req.url.split(“/”)[3];

        let body = “”;

        req.on(“data”, (chunk) => {

            body += chunk.toString();

        });

        req.on(“end”, async () => {

            // Find and update document

            let updatedBlog = await Blog.findByIdAndUpdate(id, JSON.parse(body), {

                new: true,

            });

            res.writeHead(200, { “Content-Type”: “application/json” });

            res.end(JSON.stringify(updatedBlog));

        });

    } catch (error) {

        console.log(error);

    }

}

PUT istek işleyicisi, ilgili blogu güncellemek için url’den id özelliğini çıkarması dışında, POST istek işleyicisiyle hemen hemen aynıdır .

Rotayı SİL

DELETE rota işleyicinizi uygulamak için aşağıdaki kod bloğunu yönlendirici işlevinize ekleyin :

// DELETE: /api/blogs/:id

if (req.url.match(/\/api\/blogs\/([0-9]+)/) && req.method === “DELETE”) {

    try {

        const id = req.url.split(“/”)[3];

       // Delete blog from DB

        await Blog.findByIdAndDelete(id);

        res.writeHead(200, { “Content-Type”: “application/json” });

        res.end(JSON.stringify({ message: “Blog deleted successfully” }));

    } catch (error) {

        res.writeHead(404, { “Content-Type”: “application/json” });

        res.end(JSON.stringify({ message: error }));

    }

}

Bu kod bloğu, kimliği url’den alır , eşleşen kimliğe sahip belgeyi siler, durum kodunu ve başlıkları gönderir ve isteği kapatır.

Son olarak, yönlendiriciyi server.js dosyanıza alın ve yönlendirici işlevinizi çağırın, argüman olarak req ve res iletin:

const router = require(“./routes/blogRoutes”);

const server = http.createServer((req, res) => {

    router(req, res);

});

Bu, sunucunuzun istekleri uygun şekilde engellemesini ve işlemesini sağlar.

Tamamlanan projeyi bu GitHub deposunda bulabilirsiniz .

Node.js Çerçevesi Kullanma

Elle bir web API oluşturmak mümkün olsa da, bu zor bir iş olabilir. Çok sayıda uç vakayı ele aldığınızdan ve kodunuzun hatasız olduğundan emin olmanız gerekir.

Yıllar geçtikçe geliştiriciler, bunu çok daha kolay hale getirmek için ExpressJS, NestJS, Fastify vb. gibi çerçeveler oluşturdular.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir