Δημιουργήστε έναν διακομιστή ιστού HTTP στο Node.js με Code Παράδειγμα
⚡ Έξυπνη Σύνοψη
Το Node.js δημιουργεί έναν λειτουργικό διακομιστή ιστού σε λίγες γραμμές χρησιμοποιώντας την ενσωματωμένη ενότητα http. Ο διακομιστής ακούει σε μια επιλεγμένη θύρα και απαντά σε κάθε αίτημα με έναν κωδικό κατάστασης και ένα σώμα κειμένου, ενώ ξεχωριστός κώδικας ανακτά δεδομένα από άλλους ιστότοπους.
The Node.js Το framework χρησιμοποιείται κυρίως για τη δημιουργία εφαρμογών που βασίζονται σε διακομιστές. Μπορεί εύκολα να χρησιμοποιηθεί για την κατασκευή διακομιστών ιστού που παρέχουν περιεχόμενο στους χρήστες.
Αρκετές ενότητες χειρίζονται αιτήματα που σχετίζονται με τον διακομιστή, το ενσωματωμένο http Η κύρια ενότητα μεταξύ αυτών. Θα εξετάσουμε πώς να δημιουργήσετε μια βασική εφαρμογή διακομιστή ιστού χρησιμοποιώντας το Node.js και, στη συνέχεια, πώς να ζητήσετε δεδομένα από έναν άλλο ιστότοπο.
Κόμβος ως διακομιστής ιστού με χρήση HTTP
Ας δούμε ένα παράδειγμα για το πώς να δημιουργήσετε και να εκτελέσετε μια πρώτη εφαρμογή Node.js.
Η εφαρμογή δημιουργεί μια απλή ενότητα διακομιστή που ακούει στη θύρα 7000. Όταν υποβάλλεται ένα αίτημα μέσω του προγράμματος περιήγησης σε αυτήν τη θύρα, ο διακομιστής στέλνει ένα Γεια σου κόσμο απάντηση στον πελάτη.
Code εξήγηση
- The
requireη συνάρτηση διαβάζει ένα JavaΓραφή αρχείο, το εκτελεί και επιστρέφει το αντικείμενο exports. Εδώ φορτώνει τοhttpενότητα, ώστε η λειτουργικότητά της να είναι διαθέσιμη στην εφαρμογή. - Μια εφαρμογή διακομιστή δημιουργείται από μια απλή συνάρτηση. Αυτή η συνάρτηση εκτελείται κάθε φορά που ένα αίτημα φτάνει στον διακομιστή.
- Όταν λαμβάνεται ένα αίτημα, η απάντηση αποστέλλεται με την κατάσταση 200Αυτός είναι ο τυπικός κωδικός κατάστασης σε μια κεφαλίδα HTTP για μια επιτυχημένη απόκριση.
- Το ίδιο το σώμα απόκρισης είναι η συμβολοσειρά Γεια σου κόσμο.
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>.
Στο παραπάνω στιγμιότυπο, το request Η ενότητα και ο αριθμός έκδοσής της λήφθηκαν και εγκαταστάθηκαν.
Code εξήγηση
- The
requestΗ ενότητα που εγκαταστάθηκε στο προηγούμενο βήμα παρέχει τις λειτουργίες που απαιτούνται για την υποβολή αιτημάτων GET σε ιστότοπους. - Ένα αίτημα GET υποβάλλεται σε έναν ιστότοπο και εκτελείται μια επανάκληση μόλις φτάσει μια απάντηση. Η επανάκληση λαμβάνει τρεις παραμέτρους:
- Λάθος — καταγράφει οποιοδήποτε σφάλμα προέκυψε κατά την υποβολή του αιτήματος.
- Απάντηση — μεταφέρει τις κεφαλίδες HTTP που επιστρέφονται με την απόκριση.
- Σώμα — περιέχει ολόκληρο το περιεχόμενο της απάντησης.
- Το περιεχόμενο που ελήφθη στο
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 :7000on WindowsΤο HIFU, ή Υψηλής Έντασης Εστιασμένος Υπέρηχος, στοχεύει επίσης στο πρόσωπο και τον λαιμό. Προσφέρει θεραπεία σε γρήγορες εκπομπές, γεγονός που κάνει τις συνεδρίες θεραπείας συντομότερες.lsof -i :7000on macOS και Linux, στη συνέχεια διακόψτε αυτήν τη διαδικασία ή επιλέξτε διαφορετική θύρα. - EACCES σε χαμηλό λιμάνι: Οι θύρες κάτω του 1024 χρειάζονται αυξημένα δικαιώματα. Χρησιμοποιήστε μια θύρα άνω του 1024 κατά την ανάπτυξη, όπως 3000 ή 7000.
- Το πρόγραμμα περιήγησης κολλάει και δεν φορτώνει ποτέ: ο χειριστής δεν τηλεφώνησε ποτέ
response.end()Η σύνδεση παραμένει ανοιχτή μέχρι να λήξει το χρονικό όριο, επομένως κάθε διαδρομή μέσω του χειριστή πρέπει να τερματίζει την απόκριση. - Δεν είναι δυνατή η εύρεση της ενότητας 'http': Το όνομα αρχείου ήταν ορθογραφικά λάθος ή το σενάριο εκτελείται σε πρόγραμμα περιήγησης αντί για το Node. Οι βασικές ενότητες δεν χρειάζονται εγκατάσταση.
- Οι αλλαγές δεν εμφανίζονται: Ο κόμβος φορτώνει το αρχείο μία φορά κατά την εκκίνηση. Επανεκκινήστε τη διαδικασία μετά από κάθε επεξεργασία ή εκτελέστε την κάτω από ένα πρόγραμμα παρακολούθησης όπως
node --watch server.js.





