Γνωρίστε αυτόν τον χρόνο εκτέλεσης JS που εστιάζει στην ασφάλεια με ένα πρακτικό παράδειγμα έργου.
Το Deno είναι ένας χρόνος εκτέλεσης JavaScript που βασίζεται στο V8, την ίδια μηχανή JavaScript που τροφοδοτεί το Google Chrome. Ο αρχικός δημιουργός του Node.js δημιούργησε το Deno για να αντιμετωπίσει ορισμένες από τις ελλείψεις και τις ανησυχίες ασφαλείας του Node.js.
Αν και είναι σχετικά νέο, το Deno έχει κερδίσει δημοτικότητα ως ασφαλής και σύγχρονος χρόνος εκτέλεσης JavaScript. Η εστίασή του στην ασφάλεια, η υποστήριξη σύγχρονων γλωσσικών χαρακτηριστικών και τα φιλικά προς τους προγραμματιστές εργαλεία το καθιστούν ελκυστική επιλογή. Μπορείτε να το χρησιμοποιήσετε για να δημιουργήσετε εφαρμογές από την πλευρά του διακομιστή, εργαλεία γραμμής εντολών και άλλα έργα JavaScript/TypeScript, όπως ένα απλό API.
Εγκατάσταση Deno
Για να μπορέσετε να χρησιμοποιήσετε το Deno, πρέπει να το κατεβάσετε και να το εγκαταστήσετε. Η εγκατάσταση του Deno ποικίλλει ανάλογα με το λειτουργικό σας σύστημα.
Σε macOS και Linux, μπορείτε να εγκαταστήσετε το Deno εκτελώντας αυτήν την εντολή:
curl -fsSL https://deno.land/x/install/install.sh | sh
Στα Windows, μπορείτε να εγκαταστήσετε το Deno με το Powershell, χρησιμοποιώντας αυτήν την εντολή:
irm https://deno.land/install.ps1 | iex
Μπορείτε να επιβεβαιώσετε ότι η εγκατάστασή σας ήταν επιτυχής εκτελώντας την παρακάτω εντολή:
deno --version
Η παραπάνω εντολή θα πρέπει να εκτυπώσει την έκδοση Deno στην κονσόλα.
Εάν χρησιμοποιείτε τον κώδικα VS ως IDE, μπορείτε να κάνετε λήψη Επέκταση Deno's VS Code για να προσθέσετε το IntelliSense, ενισχύοντας την παραγωγικότητα και την εμπειρία ανάπτυξης όταν εργάζεστε με έργα Deno.
Μετά την επιτυχή εγκατάσταση της επέκτασης, δημιουργήστε ένα .vscode φάκελο στον ριζικό κατάλογο του έργου σας και δημιουργήστε ένα ρυθμίσεις.json αρχείο σε αυτό.
Στη συνέχεια, προσθέστε το μπλοκ κώδικα παρακάτω στο ρυθμίσεις.json αρχείο για να ενεργοποιήσετε το IntelliSense:
{
"deno.enable": true,
"deno.unstable": true,
}
Σύνδεση σε βάση δεδομένων
Για αυτό το σεμινάριο, θα χρησιμοποιήσετε το MongoDB ως βάση δεδομένων για να διατηρήσετε δεδομένα από το API σας.
Για να συνδέσετε την εφαρμογή Deno σας σε μια βάση δεδομένων MongoDB, δημιουργήστε ένα db.js αρχείο στον ριζικό κατάλογο του έργου σας και προσθέστε το μπλοκ κώδικα παρακάτω σε αυτό:
// 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;
Σε αντίθεση με το Node.js, το οποίο εξαρτάται από διαχειριστές πακέτων όπως το Node Package Manager (npm) ή το νήμα, το Deno διαθέτει ένα ενσωματωμένο σύστημα διαχείρισης πακέτων για εισαγωγή και διαχείριση εξαρτήσεων απευθείας από διευθύνσεις URL.
Για παράδειγμα, το μπλοκ κώδικα παραπάνω εισάγεται MongoClient από τη διεύθυνση URL https://deno.land/x/[email protected]/mod.ts, που οδηγεί στο πακέτο.
Στη συνέχεια, χρησιμοποιώντας το εισαγόμενο πρόγραμμα οδήγησης Deno MongoDB (MongoClient), Το Deno δημιουργεί μια σύνδεση μεταξύ της εφαρμογής σας και μιας τοπικής βάσης δεδομένων MongoDB.
Σε ζωντανά σενάρια, είναι πιο ασφαλές να αποθηκεύετε τα διαπιστευτήρια της βάσης δεδομένων σας σε ένα .env αντί να τα αποθηκεύσετε σε απλό κείμενο, όπως έγινε παραπάνω.
Δημιουργία μοντέλου βάσης δεδομένων
Ενώ είναι δυνατόν να αλληλεπιδρούν με μια βάση δεδομένων MongoDB χωρίς μοντέλο βάσης δεδομένων, κάτι τέτοιο μπορεί να οδηγήσει σε αδόμητο και λιγότερο διατηρήσιμο κώδικα.
Για να το αποφύγετε αυτό, δημιουργήστε ένα TodoModel.ts αρχείο στον ριζικό κατάλογο του έργου σας και δομή των δεδομένων σας προσθέτοντας το παρακάτω μπλοκ κώδικα στο αρχείο:
import db from"./db.ts";
interface Todo {
title: string;
description: string;
completed?: boolean;
}const Todo = db.collection
("todos");
exportdefault Todo;
Το μπλοκ κώδικα παραπάνω ορίζει μια διεπαφή Να κάνω που αντιπροσωπεύει τη δομή ενός μεμονωμένου αντικειμένου. Στη συνέχεια, χρησιμοποιώντας τη διεπαφή Todo, δημιουργεί μια συλλογή Todo καλώντας τη μέθοδο συλλογής που εκτίθεται από το στιγμιότυπο MongoDB που δημιουργήσατε προηγουμένως.
Δημιουργία διακομιστή με Oak
Το Oak είναι ένα ενδιάμεσο λογισμικό για τον εγγενή διακομιστή HTTP της Deno. Εμπνεύστηκε από το Koa, το οποίο είναι ένα εναλλακτική λύση στο Express.js.
Για να δημιουργήσετε έναν διακομιστή με το Oak, δημιουργήστε ένα κύρια.τς αρχείο στον ριζικό κατάλογο του έργου σας και προσθέστε το μπλοκ κώδικα παρακάτω στο αρχείο σας.
// 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");
Το μπλοκ κώδικα παραπάνω εισάγεται Εφαρμογή από τη διεύθυνση URL Oak και δημιουργεί μια παρουσία εφαρμογής (εφαρμογή) που ακούει την εισερχόμενη κίνηση στη θύρα 8000.
ο app.use (router.routes()) γραμμή καταγράφει τις διαδρομές του δρομολογητή ως ενδιάμεσο λογισμικό στην εφαρμογή Oak. Αυτό σημαίνει ότι η εφαρμογή θα ταιριάζει με τις καταχωρημένες διαδρομές με τα εισερχόμενα αιτήματα και οι αντίστοιχοι χειριστές θα εκτελούνται εάν υπάρχει αντιστοιχία.
ο app.use (router.allowedMethods()) Η γραμμή χειρίζεται μεθόδους HTTP που δεν ορίζονται ρητά στο δρομολογητή. Για παράδειγμα, εάν λάβει ένα αίτημα με μια μη υποστηριζόμενη μέθοδο, για παράδειγμα, ένα μη καταχωρημένο αίτημα PUT, το allowMethods() Το ενδιάμεσο λογισμικό θα στείλει αυτόματα μια κατάλληλη απάντηση (π.χ. 405 Μέθοδος δεν επιτρέπεται).
Εφαρμογή της Λειτουργικότητας CRUD
Αυτό το σεμινάριο θα περιλαμβάνει ένα απλό Todo API με λειτουργικότητα CRUD.
Δημιουργώ ένα router.ts αρχείο στον ριζικό κατάλογο του έργου σας και προσθέστε το παρακάτω μπλοκ κώδικα στο αρχείο σας:
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
Το μπλοκ κώδικα παραπάνω εισάγει και δημιουργεί μια παρουσία του δρομολογητή Oak. Χρησιμοποιώντας αυτό το παράδειγμα, μπορείτε να δημιουργήσετε προγράμματα χειρισμού διαδρομής για διάφορες μεθόδους HTTP καλώντας τα αντίστοιχα ονόματα μεθόδων (παίρνω, Θέση, βάζω, διαγράφω).
Για παράδειγμα, το παρακάτω μπλοκ κώδικα είναι ένα παράδειγμα του τρόπου με τον οποίο μπορείτε να δημιουργήσετε ένα πρόγραμμα χειρισμού διαδρομής GET που επιστρέφει όλα τα έγγραφα στη συλλογή σας Todo.
router
.get("/api/todos", (ctx: RouterContextapi/todos">) => {
ctx.response.body = Todo.find();
})
Για να στείλετε ένα αντικείμενο απόκρισης χρησιμοποιώντας το Deno, πρέπει να αντιστοιχίσετε το ανταπόκριση.σώμα αντικείμενο στο RouterContex στο αντικείμενο απόκρισης. Το ίδιο ισχύει και για τους κωδικούς κατάστασης.
Για να προσθέσετε άλλους χειριστές διαδρομής, μπορείτε να τους συνδέσετε με το προηγούμενο πρόγραμμα χειρισμού διαδρομής.
Όπως έτσι:
.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,
};
}
})
Το μπλοκ κώδικα παραπάνω ορίζει έναν χειριστή διαδρομής GET που επιστρέφει ένα μεμονωμένο στοιχείο Todo που ταιριάζει με το αναγνωριστικό στις παραμέτρους διεύθυνσης URL.
Στη συνέχεια, ορίστε ένα πρόγραμμα χειρισμού διαδρομής CREATE που προσθέτει νέα έγγραφα στη συλλογή σας:
.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,
};
}
})
Στη συνέχεια, προσθέστε ένα πρόγραμμα χειρισμού διαδρομής PUT που ενημερώνει ένα Todo με βάση το ταυτότητα παράμετρο, με τα δεδομένα που αποστέλλονται στο σώμα του αιτήματος.
.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,
};
}
})
Τέλος, δημιουργήστε ένα πρόγραμμα χειρισμού διαδρομής DELETE που αφαιρεί ένα Todo από τη συλλογή MongoDB:
.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 με αυτήν την εντολή:
deno run --allow-net --allow-read --allow-env --watch main.ts
Από προεπιλογή, μια δέσμη ενεργειών Deno δεν μπορεί να έχει πρόσβαση σε οτιδήποτε εκτός του πεδίου εφαρμογής της, όπως το δίκτυο ή το σύστημα αρχείων. Επομένως, για να ξεκινήσετε την αίτησή σας, πρέπει να συμπεριλάβετε διάφορες σημαίες για να εκχωρήσετε στην Deno τα απαιτούμενα δικαιώματα.
--επιτρέπω-καθαρό επιτρέπει στην Deno να κάνει αιτήματα δικτύου. --επιτρέπω-διαβάζω επιτρέπει στο Deno να έχει πρόσβαση στο σύστημα αρχείων και να διαβάζει αρχεία. --επιτρέπω-env επιτρέπει στην Deno να έχει πρόσβαση σε περιβαλλοντικές μεταβλητές. ο --παρακολουθώ Η σημαία ξεκινά την εφαρμογή Deno σε λειτουργία παρακολούθησης.
Μετεγκατάσταση από το Node.js στο Deno
Η μετεγκατάσταση από το Node.js στο Deno για τη δημιουργία REST API μπορεί να αποφέρει σημαντικά οφέλη ασφάλειας, παραγωγικότητας προγραμματιστών και διαχείρισης εξάρτησης. Χρησιμοποιώντας τον ασφαλή χρόνο εκτέλεσης της Deno, την εγγενή υποστήριξη TypeScript και την απλοποιημένη διαχείριση εξαρτήσεων, μπορείτε εύκολα να δημιουργήσετε ισχυρά και αποτελεσματικά API REST.
Ωστόσο, το ανώριμο οικοσύστημα του Deno μπορεί να σας κάνει να το ξανασκεφτείτε. Εάν επιλέξετε να μεταναστεύσετε, ζυγίστε προσεκτικά τα υπέρ και τα κατά.