Bu güvenlik odaklı JS çalışma zamanını pratik bir örnek proje ile tanıyın.

Deno, Google Chrome'a ​​güç sağlayan JavaScript motorunun aynısı olan V8 üzerinde oluşturulmuş bir JavaScript çalışma zamanıdır. Node.js'nin orijinal yaratıcısı, Node.js'nin bazı eksikliklerini ve güvenlik endişelerini gidermek için Deno'yu yarattı.

Nispeten yeni olmasına rağmen Deno, güvenli ve modern bir JavaScript çalışma zamanı olarak popülerlik kazanmıştır. Güvenliğe odaklanması, modern dil özelliklerini desteklemesi ve geliştirici dostu araçları onu çekici bir seçim haline getiriyor. Basit bir API gibi sunucu tarafı uygulamaları, komut satırı araçları ve diğer JavaScript/TypeScript projeleri oluşturmak için kullanabilirsiniz.

Deno'yu Kurmak

Deno'yu kullanmadan önce indirip yüklemeniz gerekir. Deno'nun kurulumu, işletim sisteminize bağlı olarak değişir.

macOS ve Linux'ta şu komutu çalıştırarak Deno'yu yükleyebilirsiniz:

curl -fsSL https://deno.land/x/install/install.sh | sh

Windows'ta, şu komutu kullanarak Deno'yu Powershell ile kurabilirsiniz:

instagram viewer
irm https://deno.land/install.ps1 | iex

Aşağıdaki komutu çalıştırarak kurulumunuzun başarılı olduğunu onaylayabilirsiniz:

deno --version

Yukarıdaki komut, Deno sürümünü konsola yazdırmalıdır.

IDE olarak VS Code kullanıyorsanız, indirebilirsiniz Deno'nun VS Code uzantısı Deno projeleriyle çalışırken üretkenliğinizi ve geliştirme deneyiminizi geliştiren IntelliSense'i eklemek için.

Uzantıyı başarıyla yükledikten sonra bir .vs kodu projenizin kök dizininde bir klasör oluşturun ve bir ayarlar.json içinde dosya.

Ardından, aşağıdaki kod bloğunu ayarlar.json IntelliSense'i etkinleştirmek için dosya:

{
"deno.enable": true,
"deno.unstable": true,
}

Bir Veritabanına Bağlanma

Bu öğretici için, API'nizdeki verileri kalıcı hale getirmek için bir veritabanı olarak MongoDB'yi kullanacaksınız.

Deno uygulamanızı bir MongoDB veritabanına bağlamak için bir db.js proje kök dizininizde dosya oluşturun ve aşağıdaki kod bloğunu buna ekleyin:

// db.js
import { MongoClient } from"https://deno.land/x/[email protected]/mod.ts";

const client = new MongoClient();

try {
await client.connect("mongodb://localhost: 27017/todo");

console.log("Connected to database");
} catch (err) {
console.log("Error connecting to database", err);
}

const db = client.database("todo");

exportdefault db;

bağlı olan Node.js'den farklı olarak paket yöneticileri Düğüm Paket Yöneticisi (npm) veya yarn gibi Deno, bağımlılıkları doğrudan URL'lerden içe aktarmak ve yönetmek için yerleşik bir paket yönetim sistemine sahiptir.

Örneğin, yukarıdaki kod bloğu içe aktarır MongoClient URL'den https://deno.land/x/[email protected]/mod.ts, bu da pakete götürür.

Ardından, içe aktarılan Deno MongoDB sürücüsünü kullanarak (MongoClient), Deno, uygulamanız ile yerel bir MongoDB veritabanı arasında bir bağlantı kurar.

Canlı senaryolarda, veritabanı kimlik bilgilerinizi bir .env yukarıda yapıldığı gibi düz metin olarak saklamak yerine dosya.

Veritabanı Modeli Oluşturma

mümkün iken bir MongoDB veritabanıyla etkileşime geçin bir veritabanı modeli olmadan bunu yapmak, yapılandırılmamış ve daha az bakım yapılabilir koda yol açabilir.

Bunu önlemek için, bir TodoModel.ts dosyasını projenizin kök dizinine yerleştirin ve aşağıdaki kod bloğunu dosyaya ekleyerek verilerinizi yapılandırın:

import db from"./db.ts";

interface Todo {
title: string;
description: string;
completed?: boolean;
}

const Todo = db.collection("todos");

exportdefault Todo;

Yukarıdaki kod bloğu bir arayüzü tanımlar. Yapmak tek bir yapılacak iş öğesinin yapısını temsil eder. Ardından Todo arayüzünü kullanarak, daha önce oluşturduğunuz MongoDB bulut sunucunuz tarafından sunulan toplama yöntemini çağırarak bir Yapılacaklar koleksiyonu oluşturur.

Oak ile Sunucu Oluşturma

Oak, Deno'nun yerel HTTP sunucusu için bir ara katman yazılımıdır. olan Koa'dan ilham almıştır. Express.js'ye alternatif.

Oak ile bir sunucu oluşturmak için bir sunucu oluşturun. ana.ts Dosyayı projenizin kök dizinine ekleyin ve aşağıdaki kod bloğunu dosyanıza ekleyin.

// main.ts

import { Application } from"https://deno.land/x/oak/mod.ts";
import router from"./router.ts";

const app = new Application();

app.use(router.routes());
app.use(router.allowedMethods());

await app.listen({ port: 8000 });
console.log("Server running on port 8000");

İçe aktarma işlemlerinin üzerindeki kod bloğu Başvuru Oak URL'sinden ve bir uygulama örneği oluşturur (uygulama) 8000 numaralı bağlantı noktasında gelen trafiği dinler.

bu app.use (yönlendirici.routes()) line, yönlendiricinin rotalarını Oak uygulamasında ara yazılım olarak kaydeder. Bu, uygulamanın kayıtlı rotaları gelen isteklere karşı eşleştireceği ve bir eşleşme varsa karşılık gelen işleyicilerin çalışacağı anlamına gelir.

bu app.use (router.allowedMethods()) line, yönlendiricide açıkça tanımlanmayan HTTP yöntemlerini işler. Örneğin, kayıtsız bir PUT isteği gibi desteklenmeyen bir yöntemle bir istek alırsa, izin verilen Yöntemler() ara yazılım otomatik olarak uygun bir yanıt gönderir (örn. 405 Yönteme İzin Verilmiyor).

CRUD İşlevselliğini Uygulama

Bu öğretici, CRUD işlevine sahip basit bir yapılacaklar API'sini içerecektir.

Oluşturmak yönlendirici.ts projenizin kök dizininde dosya oluşturun ve aşağıdaki kod bloğunu dosyanıza ekleyin:

import { Router } from"https://deno.land/x/oak/mod.ts";
import Todo from"./todoModel.ts";
import { ObjectId } from"https://deno.land/x/[email protected]/mod.ts";

const router = new Router(); // Create Router

Yukarıdaki kod bloğu, Oak yönlendiricinin bir örneğini içe aktarır ve oluşturur. Bu örneği kullanarak, ilgili yöntem adlarını çağırarak çeşitli HTTP yöntemleri için yol işleyicileri oluşturabilirsiniz (elde etmek, postalamak, koymak, silmek).

Örneğin, aşağıdaki kod bloğu, Todo koleksiyonunuzdaki tüm belgeleri döndüren bir GET rota işleyicisini nasıl oluşturabileceğinize bir örnektir.

router
.get("/api/todos", (ctx: RouterContextapi/todos">) => {
ctx.response.body = Todo.find();
})

Deno kullanarak bir yanıt nesnesi göndermek için, yanıt.vücut RouterContex'teki nesneyi yanıt nesnesine. Aynısı durum kodları için de geçerlidir.

Başka rota işleyicileri eklemek için onları önceki rota işleyiciye zincirleyebilirsiniz.

Şöyle:

.get("/api/todo/:id", async (ctx: RouterContext<"/api/todo/:id">) => {
try {
const todo = await Todo.findOne({ _id: new ObjectId(ctx.params.id) });

if (!todo) {
ctx.response.status = 404;

ctx.response.body = {
msg: "Todo not found",
};

return;
}

ctx.response.body = todo;
} catch (error) {
ctx.response.status = 500;

ctx.response.body = {
msg: "Error getting todo",
error,
};
}
})

Yukarıdaki kod bloğu, URL parametrelerindeki kimlikle eşleşen tek bir Yapılacaklar öğesi döndüren bir GET yolu işleyicisini tanımlar.

Ardından, koleksiyonunuza yeni belgeler ekleyen bir CREATE yol işleyicisi tanımlayın:

.post("/api/todo/new", async (ctx: RouterContext<"/api/todo/new">) => {
const body = ctx.request.body();
const todo = await body.value;

if (!todo) {
ctx.response.status = 400;
ctx.response.body = { msg: "Invalid data. Please provide a valid todo." };
return;
}

const { title, description } = todo;

if (!(title && description)) {
ctx.response.status = 400;

ctx.response.body = {
msg: "Title or description missing. Please provide a valid todo.",
};

return;
}

try {
await Todo.insertOne({
title: todo.title,
description: todo.description,
completed: false,
});

ctx.response.status = 201;

ctx.response.body = {
msg: "Todo added successfully",
};
} catch (error) {
ctx.response.status = 500;

ctx.response.body = {
msg: "Error adding todo",
error,
};
}
})

Ardından, bir Yapılacak İşi güncelleyen bir PUT yol işleyicisi ekleyin. İD parametre, istek gövdesinde gönderilen verilerle.

.put("/api/todo/:id", async (ctx: RouterContext<"/api/todo/:id">) => {
try {
const body = ctx.request.body();
const todo = await body.value;

await Todo.updateOne(
{ _id: new ObjectId(ctx.params.id) },
{ $set: { title: todo.title, description: todo.description } }
);

ctx.response.status = 200;

ctx.response.body = {
msg: "Todo updated successfully",
};
} catch (error) {
console.log(error);
ctx.response.status = 500;

ctx.response.body = {
msg: "Error updating todo",
error: error.message,
};
}
})

Son olarak, MongoDB koleksiyonunuzdan bir Todo'yu kaldıran bir DELETE yol işleyicisi oluşturun:

.delete("/api/todo/:id", async (ctx: RouterContext<"/api/todo/:id">) => {
await Todo.deleteOne({ _id: new ObjectId(ctx.params.id) });

ctx.response.status = 200;

ctx.response.body = {
msg: "Todo deleted successfully",
};
});

Deno uygulamanızı şu komutla başlatabilirsiniz:

deno run --allow-net --allow-read --allow-env --watch main.ts

Varsayılan olarak, bir Deno betiği, ağ veya dosya sistemi gibi kapsamı dışındaki hiçbir şeye erişemez. Bu nedenle, başvurunuzu başlatmak için, Deno'ya gerekli izinleri vermek üzere çeşitli işaretler eklemelisiniz.

--izin-net Deno'nun ağ istekleri yapmasına izin verir. --izin-oku Deno'nun dosya sistemine erişmesine ve dosyaları okumasına izin verir. --izin-env Deno'nun çevresel değişkenlere erişmesine izin verir. bu --kol saati flag, Deno uygulamanızı saat modunda başlatır.

Node.js'den Deno'ya Geçiş

REST API'leri oluşturmak için Node.js'den Deno'ya geçiş, önemli güvenlik, geliştirici üretkenliği ve bağımlılık yönetimi avantajları sağlayabilir. Deno'nun güvenli çalışma zamanını, yerel TypeScript desteğini ve basitleştirilmiş bağımlılık yönetimini kullanarak, sağlam ve verimli REST API'lerini kolayca oluşturabilirsiniz.

Ancak Deno'nun olgunlaşmamış ekosistemi, yeniden düşünmenize neden olabilir. Göç etmeyi seçerseniz, artıları ve eksileri dikkatlice tartın.