Δημιουργήστε έναν διακομιστή ιστού HTTP στο Node.js με Code Παράδειγμα

⚡ Έξυπνη Σύνοψη

Το Node.js δημιουργεί έναν λειτουργικό διακομιστή ιστού σε λίγες γραμμές χρησιμοποιώντας την ενσωματωμένη ενότητα http. Ο διακομιστής ακούει σε μια επιλεγμένη θύρα και απαντά σε κάθε αίτημα με έναν κωδικό κατάστασης και ένα σώμα κειμένου, ενώ ξεχωριστός κώδικας ανακτά δεδομένα από άλλους ιστότοπους.

  • Δημιουργία διακομιστή: Το http.createServer καταγράφει μια επανάκληση που εκτελείται μία φορά ανά εισερχόμενο αίτημα και λαμβάνει αντικείμενα αιτήματος και απόκρισης.
  • 🔢 Κατάσταση και κεφαλίδες: Η writeHead στέλνει τον κωδικό κατάστασης και τον τύπο περιεχομένου πριν από την εγγραφή οποιουδήποτε περιεχομένου σώματος.
  • 🔌 Σύνδεση θύρας: Η εντολή server.listen συνδέει την εφαρμογή σε μια θύρα και μπορεί να επιλεγεί οποιοσδήποτε ελεύθερος αριθμός θύρας.
  • 📥 Εξερχόμενα Αιτήματα: Η ανάκτηση δεδομένων από άλλον ιστότοπο απαιτεί ένα πρόγραμμα-πελάτη HTTP και το Node πλέον παρέχει μια καθολική συνάρτηση ανάκτησης.
  • ⚠️ Απαρχαιωμένος Πελάτης: Η ενότητα αιτήματος καταργήθηκε τον Φεβρουάριο του 2020 και δεν θα πρέπει να χρησιμοποιείται σε νέο κώδικα.
  • Αποτυχίες εκκίνησης: Ένα σφάλμα EADDRINUSE σημαίνει ότι η επιλεγμένη θύρα κατέχεται ήδη από μια άλλη διεργασία.

Δημιουργία διακομιστή Web HTTP στο Node.js

The Node.js Το framework χρησιμοποιείται κυρίως για τη δημιουργία εφαρμογών που βασίζονται σε διακομιστές. Μπορεί εύκολα να χρησιμοποιηθεί για την κατασκευή διακομιστών ιστού που παρέχουν περιεχόμενο στους χρήστες.

Αρκετές ενότητες χειρίζονται αιτήματα που σχετίζονται με τον διακομιστή, το ενσωματωμένο http Η κύρια ενότητα μεταξύ αυτών. Θα εξετάσουμε πώς να δημιουργήσετε μια βασική εφαρμογή διακομιστή ιστού χρησιμοποιώντας το Node.js και, στη συνέχεια, πώς να ζητήσετε δεδομένα από έναν άλλο ιστότοπο.

Κόμβος ως διακομιστής ιστού με χρήση HTTP

Ας δούμε ένα παράδειγμα για το πώς να δημιουργήσετε και να εκτελέσετε μια πρώτη εφαρμογή Node.js.

Η εφαρμογή δημιουργεί μια απλή ενότητα διακομιστή που ακούει στη θύρα 7000. Όταν υποβάλλεται ένα αίτημα μέσω του προγράμματος περιήγησης σε αυτήν τη θύρα, ο διακομιστής στέλνει ένα Γεια σου κόσμο απάντηση στον πελάτη.

Κόμβος ως διακομιστής ιστού με χρήση HTTP

Code εξήγηση

  1. The require η συνάρτηση διαβάζει ένα JavaΓραφή αρχείο, το εκτελεί και επιστρέφει το αντικείμενο exports. Εδώ φορτώνει το http ενότητα, ώστε η λειτουργικότητά της να είναι διαθέσιμη στην εφαρμογή.
  2. Μια εφαρμογή διακομιστή δημιουργείται από μια απλή συνάρτηση. Αυτή η συνάρτηση εκτελείται κάθε φορά που ένα αίτημα φτάνει στον διακομιστή.
  3. Όταν λαμβάνεται ένα αίτημα, η απάντηση αποστέλλεται με την κατάσταση 200Αυτός είναι ο τυπικός κωδικός κατάστασης σε μια κεφαλίδα HTTP για μια επιτυχημένη απόκριση.
  4. Το ίδιο το σώμα απόκρισης είναι η συμβολοσειρά Γεια σου κόσμο.
  5. server.listen κάνει την εφαρμογή να ακούει αιτήματα πελατών στη θύρα 7000. Μπορεί να χρησιμοποιηθεί οποιαδήποτε διαθέσιμη θύρα.

Εάν η εντολή εκτελεστεί με επιτυχία, εμφανίζεται η ακόλουθη έξοδος στο πρόγραμμα περιήγησης.

Παραγωγή

Έξοδος διακομιστή ιστού κόμβου

Από την έξοδο:

  • Περιήγηση στον τοπικό κεντρικό υπολογιστή URL στη θύρα 7000 εμφανίζεται η συμβολοσειρά Γεια σου κόσμο στη σελίδα.
  • Επειδή ο κώδικας καθορίζει τη θύρα 7000, η ​​έξοδος είναι ορατή μόνο κατά την περιήγηση σε αυτήν τη θύρα.

Εδώ είναι ο κώδικας για αναφορά:

var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello World\n");
});

server.listen(7000);

Χειρισμός αιτημάτων GET στο Node.js

Η υποβολή ενός αιτήματος GET για την ανάκτηση δεδομένων από έναν άλλο ιστότοπο είναι απλή στο Node.js. Ιστορικά, αυτό απαιτούσε το request ενότητα, εγκατεστημένη από τη γραμμή εντολών:

npm install request

Αυτή η εντολή ζητά από τον διαχειριστή πακέτων Node να κατεβάσει την απαιτούμενη ενότητα και να την εγκαταστήσει. Όταν η εγκατάσταση ολοκληρωθεί με επιτυχία, η γραμμή εντολών εμφανίζει το όνομα και την έκδοση της εγκατεστημένης ενότητας στη μορφή <name>@<version>.

έξοδος αιτήματος εγκατάστασης npm

Στο παραπάνω στιγμιότυπο, το request Η ενότητα και ο αριθμός έκδοσής της λήφθηκαν και εγκαταστάθηκαν.

Υποβολή αιτήματος GET στο Node.js

Code εξήγηση

  1. The request Η ενότητα που εγκαταστάθηκε στο προηγούμενο βήμα παρέχει τις λειτουργίες που απαιτούνται για την υποβολή αιτημάτων GET σε ιστότοπους.
  2. Ένα αίτημα GET υποβάλλεται σε έναν ιστότοπο και εκτελείται μια επανάκληση μόλις φτάσει μια απάντηση. Η επανάκληση λαμβάνει τρεις παραμέτρους:
    1. Λάθος — καταγράφει οποιοδήποτε σφάλμα προέκυψε κατά την υποβολή του αιτήματος.
    2. Απάντηση — μεταφέρει τις κεφαλίδες HTTP που επιστρέφονται με την απόκριση.
    3. Σώμα — περιέχει ολόκληρο το περιεχόμενο της απάντησης.
  3. Το περιεχόμενο που ελήφθη στο body Η παράμετρος γράφεται στην κονσόλα.

Εδώ είναι ο κώδικας για αναφορά:

var request = require("request");

request("https://example.com", function(error, response, body) {
    // Always check the error parameter before using the body
    if (error) {
        console.error("Request failed:", error.message);
        return;
    }
    console.log(body);
});

⚠️ Ειδοποίηση κατάργησης: ο request η ενότητα ήταν πλήρως καταργήθηκε τον Φεβρουάριο του 2020 και δεν λαμβάνει περαιτέρω ενημερώσεις. Εξακολουθεί να εγκαθίσταται και να εκτελείται, επομένως το παραπάνω παράδειγμα παραμένει έγκυρο για υπάρχοντα έργα, αλλά npm install request τώρα εκτυπώνει μια προειδοποίηση κατάργησης. Ο νέος κώδικας θα πρέπει να χρησιμοποιεί την ενσωματωμένη fetch λειτουργία που παρουσιάζεται στην επόμενη ενότητα.

Πώς να κάνετε αιτήματα HTTP με εγγενή ανάκτηση στο Node.js

Ο κόμβος έχει συμπεριλάβει ένα καθολικό fetch λειτουργία από την έκδοση 18, που ταιριάζει με τα προγράμματα περιήγησης API που ήδη παρέχουν. Δεν απαιτείται εγκατάσταση πακέτου και η συνάρτηση επιστρέφει μια υπόσχεση, επομένως λειτουργεί απευθείας με async/await.

// No require and no npm install needed on Node 18 or later

async function getData() {
    try {
        const response = await fetch("https://example.com");

        // fetch does NOT reject on 404 or 500 — check ok yourself
        if (!response.ok) {
            throw new Error("HTTP status " + response.status);
        }

        const body = await response.text();
        console.log(body);

    } catch (err) {
        // Network failures and the throw above both land here
        console.error("Request failed:", err.message);
    }
}

getData();

Αξίζει να σημειωθούν τρεις διαφορές από το στυλ επανάκλησης. Πρώτον, fetch απορρίπτεται μόνο σε περίπτωση σφάλματος σε επίπεδο δικτύου. Ένα HTTP 404 ή 500 εξακολουθεί να επιλύεται με επιτυχία, γι' αυτό και το response.ok υπάρχει έλεγχος και γιατί η παράλειψή του είναι το πιο συνηθισμένο λάθος κατά τη μετάβαση από requestΔεύτερον, το σώμα δεν παραδίδεται με την απάντηση — πρέπει να διαβαστεί ρητά με response.text() για απλό κείμενο ή response.json() για JSON, και το καθένα από αυτά επιστρέφει μια δική του υπόσχεση. Τρίτον, επειδή ολόκληρη η κλήση βασίζεται σε υπόσχεση, ένα μόνο try/catch Καλύπτει τόσο το αίτημα όσο και το σώμα που διαβάζεται, αντικαθιστώντας πλήρως την παράμετρο επανάκλησης που βασίζεται στο σφάλμα πρώτα.

Για σενάρια που πρέπει να εκτελούνται σε Node 16 ή παλαιότερη έκδοση, εγκαταστήστε node-fetch or axios αντίθετα, καθώς και τα δύο εκθέτουν μια συγκρίσιμη διεπαφή βασισμένη σε υποσχέσεις και απαιτούν μόνο μια αλλαγή στη γραμμή εισαγωγής μόλις αναβαθμιστεί το runtime.

request vs fetch vs axios: Ποιο να χρησιμοποιήσετε

Τρία προγράμματα-πελάτες HTTP εμφανίζονται στο μεγαλύτερο μέρος του υλικού Node και μόνο ένα από αυτά αποτελεί λογική προεπιλογή για νέα εργασία. Διαφέρουν ως προς την κατάσταση συντήρησης, ως προς το εάν απαιτείται καθόλου μια εξάρτηση και ως προς τον τρόπο με τον οποίο το καθένα σηματοδοτεί μια κατάσταση σφάλματος, επομένως ο παρακάτω πίνακας τα παραθέτει δίπλα-δίπλα.

Άποψη ζητήσει fetch (ενσωματωμένο) αξίους
Κατάσταση Καταργημένο από το 2020 Διατηρείται στον πυρήνα Συντηρείται ενεργά
Εγκατάσταση πακέτο npm Κανένα στον Κόμβο 18+ πακέτο npm
Επιλέξτε Επανάκληση με το πρώτο σφάλμα Υπόσχεση Υπόσχεση
Ανάλυση JSON Μη αυτόματη ή επιλογή json Εγχειρίδιο μέσω response.json() Αυτόματο
Απορρίπτει το 404 ή το 500 Οχι Οχι Ναι

Χρήση fetch για νέα έργα σε μια τρέχουσα έκδοση Node, καθώς δεν προσθέτει καμία εξάρτηση και ταιριάζει με τα API του προγράμματος περιήγησης που ήδη γνωρίζουν. Επιλέξτε axios όταν ο αυτόματος χειρισμός JSON, οι αναχαιτιστές αιτημάτων ή η απόρριψη σε καταστάσεις σφάλματος θα εξοικονομούσαν πραγματικό κώδικα. Διατηρήστε request μόνο μέσα σε παλαιότερες εφαρμογές που εξαρτώνται ήδη από αυτό και σχεδιάζετε να το αντικαταστήσετε.

Συνηθισμένα σφάλματα διακομιστή Node.js και πώς να τα διορθώσετε

Οι περισσότερες αποτυχίες κατά την εκκίνηση ενός πρώτου διακομιστή Node προέρχονται από θύρες, διαδρομές ή μια ελλείπουσα απόκριση και όχι από τον ίδιο τον κώδικα του διακομιστή.

  • EADDRINUSE: μια άλλη διεργασία κατέχει ήδη τη θύρα. Εκτέλεση netstat -ano | findstr :7000 on WindowsΤο HIFU, ή Υψηλής Έντασης Εστιασμένος Υπέρηχος, στοχεύει επίσης στο πρόσωπο και τον λαιμό. Προσφέρει θεραπεία σε γρήγορες εκπομπές, γεγονός που κάνει τις συνεδρίες θεραπείας συντομότερες. lsof -i :7000 on macOS και Linux, στη συνέχεια διακόψτε αυτήν τη διαδικασία ή επιλέξτε διαφορετική θύρα.
  • EACCES σε χαμηλό λιμάνι: Οι θύρες κάτω του 1024 χρειάζονται αυξημένα δικαιώματα. Χρησιμοποιήστε μια θύρα άνω του 1024 κατά την ανάπτυξη, όπως 3000 ή 7000.
  • Το πρόγραμμα περιήγησης κολλάει και δεν φορτώνει ποτέ: ο χειριστής δεν τηλεφώνησε ποτέ response.end()Η σύνδεση παραμένει ανοιχτή μέχρι να λήξει το χρονικό όριο, επομένως κάθε διαδρομή μέσω του χειριστή πρέπει να τερματίζει την απόκριση.
  • Δεν είναι δυνατή η εύρεση της ενότητας 'http': Το όνομα αρχείου ήταν ορθογραφικά λάθος ή το σενάριο εκτελείται σε πρόγραμμα περιήγησης αντί για το Node. Οι βασικές ενότητες δεν χρειάζονται εγκατάσταση.
  • Οι αλλαγές δεν εμφανίζονται: Ο κόμβος φορτώνει το αρχείο μία φορά κατά την εκκίνηση. Επανεκκινήστε τη διαδικασία μετά από κάθε επεξεργασία ή εκτελέστε την κάτω από ένα πρόγραμμα παρακολούθησης όπως node --watch server.js.

Συχνές Ερωτήσεις

Η ενότητα http επαρκεί για ένα μόνο τελικό σημείο. Το Express προσθέτει δρομολόγηση, middleware και ανάλυση σώματος, τα οποία αποκτούν αξία ως εξάρτηση όταν μια εφαρμογή εξυπηρετεί πολλές διαδρομές.

Απαιτείται το https ενότητα αντ' αυτού και να μεταβιβάσετε ένα κλειδί και ένα πιστοποιητικό στο createServer. Στην παραγωγή, ένας αντίστροφος διακομιστής μεσολάβησης όπως το Nginx συνήθως τερματίζει το TLS και προωθεί το απλό HTTP στο Node.

Ναί. AI Τα εργαλεία μετατρέπουν αξιόπιστα τις επανακλήσεις με βάση το σφάλμα σε ασύγχρονη αναμονή. Ελέγξτε ότι ο δημιουργημένος κώδικας προσθέτει μια δοκιμή response.ok, επειδή η fetch επιλύεται σε 404 και ότι ο έλεγχος συχνά παραλείπεται.

Οι βοηθοί τεχνητής νοημοσύνης διαβάζουν τον κωδικό σφάλματος και κατονομάζουν απευθείας την αιτία, διακρίνοντας μια διένεξη θύρας από ένα πρόβλημα δικαιωμάτων ή ένα σφάλμα σύνταξης, γεγονός που μειώνει σημαντικά τον χρόνο εικασίας σε ένα πρώτο έργο Node.

Το αντικείμενο αιτήματος είναι μια ροή, επομένως συλλέξτε τα συμβάντα δεδομένων του σε ένα buffer και αναλύστε το αποτέλεσμα στο τελικό συμβάν. Το Express και παρόμοια πλαίσια παρέχουν middleware ανάλυσης σώματος που εκτελεί αυτό το βήμα για εσάς.

Συνοψίστε αυτήν την ανάρτηση με: