Έκδοση JavaScript Node.js 17.0 από την πλευρά του διακομιστή

Πραγματοποιήθηκε η κυκλοφορία του Node.js 17.0, μιας πλατφόρμας για την εκτέλεση εφαρμογών δικτύου σε JavaScript. Το Node.js 17.0 είναι ένας κανονικός κλάδος υποστήριξης με ενημερώσεις έως τον Ιούνιο του 2022. Τις επόμενες ημέρες θα ολοκληρωθεί η σταθεροποίηση του κλάδου Node.js 16, ο οποίος θα λάβει το καθεστώς LTS και θα υποστηρίζεται μέχρι τον Απρίλιο του 2024. Η συντήρηση του προηγούμενου κλάδου Node.js 14.0 LTS θα διαρκέσει έως τον Απρίλιο του 2023 και του προηγούμενου κλάδου 12.0 LTS έως τον Απρίλιο του 2022.

Βασικές βελτιώσεις:

  • Ο κινητήρας V8 έχει ενημερωθεί στην έκδοση 9.5.
  • Συνεχίστηκε η υλοποίηση παραλλαγών του βασικού API που βασίζονται στη χρήση της ασύγχρονης υπολογιστικής διεπαφής Promise. Εκτός από τα προηγούμενα προτεινόμενα API Timers Promises και Streams Promises, το Node.js 17.0 εισάγει το Readline Promise API για ανάγνωση δεδομένων γραμμή προς γραμμή χρησιμοποιώντας τη λειτουργική μονάδα readline. Εισαγωγή * ως γραμμή ανάγνωσης από το 'node:readline/promises'; εισαγωγή { stdin ως είσοδος, stdout ως έξοδο } από το 'process'; const rl = readline.createInterface({ input, output }); const answer = await rl.question('Τι πιστεύετε για το Node.js;'); console.log('Σας ευχαριστούμε για τα πολύτιμα σχόλιά σας: ${answer}'); rl.close();
  • Η παρεχόμενη βιβλιοθήκη OpenSSL έχει ενημερωθεί στην έκδοση 3.0 (χρησιμοποιώντας το πιρούνι quictls/openssl με ενεργοποιημένη την υποστήριξη πρωτοκόλλου QUIC).
  • Βεβαιωθείτε ότι η έκδοση Node.js εμφανίζεται σε ίχνη στοίβας για ανεπανόρθωτα σφάλματα που προκαλούν τον τερματισμό της εφαρμογής.

Επιπλέον, μπορούμε να αναφέρουμε την εξάλειψη δύο ευπαθειών στους τρέχοντες κλάδους του Node.js (CVE-2021-22959, CVE-2021-22960), οι οποίες καθιστούν δυνατή την εκτέλεση επιθέσεων της κλάσης HTTP Request Smuggling (HRS), οι οποίες επιτρέψτε, μέσω της αποστολής ειδικά σχεδιασμένων αιτημάτων πελατών, να ενσωματωθεί στο περιεχόμενο αιτημάτων από άλλους χρήστες που υποβάλλονται σε επεξεργασία στο ίδιο νήμα μεταξύ του frontend και του backend (για παράδειγμα, μπορείτε να επιτύχετε την αντικατάσταση κακόβουλου κώδικα JavaScript σε περίοδο λειτουργίας άλλου χρήστη). Λεπτομέρειες θα αποκαλυφθούν αργότερα, αλλά προς το παρόν είναι μόνο γνωστό ότι τα προβλήματα προκαλούνται από λανθασμένο χειρισμό των διαστημάτων μεταξύ του ονόματος κεφαλίδας HTTP και άνω και κάτω τελείας, καθώς και από διαφορετικό χειρισμό χαρακτήρων επιστροφής μεταφοράς και τροφοδοσίας γραμμής στο μπλοκ παραμέτρων που χρησιμοποιείται κατά τη μετάδοση το σώμα της αίτησης σε κομμάτια σε λειτουργία "κομματιασμένη".

Θυμηθείτε ότι η πλατφόρμα Node.js μπορεί να χρησιμοποιηθεί τόσο για τη συντήρηση διακομιστή εφαρμογών Web όσο και για τη δημιουργία συνηθισμένων προγραμμάτων δικτύου πελατών και διακομιστή. Για την επέκταση της λειτουργικότητας των εφαρμογών για το Node.js, έχει προετοιμαστεί μια μεγάλη συλλογή λειτουργικών μονάδων, στις οποίες μπορείτε να βρείτε ενότητες με την υλοποίηση HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3 διακομιστές και πελάτες, ενότητες για ενοποίηση με διάφορα πλαίσια web, προγράμματα χειρισμού WebSocket και Ajax, υποδοχές DBMS (MySQL, PostgreSQL, SQLite, MongoDB), μηχανές προτύπων, μηχανές CSS, υλοποιήσεις αλγορίθμων κρυπτογράφησης και συστήματα εξουσιοδότησης (OAuth), αναλυτές XML.

Για να διασφαλίσει την επεξεργασία μεγάλου αριθμού παράλληλων αιτημάτων, το Node.js χρησιμοποιεί ένα μοντέλο ασύγχρονης εκτέλεσης κώδικα που βασίζεται στον χειρισμό συμβάντων χωρίς αποκλεισμό και στον ορισμό των χειριστών επανάκλησης. Υποστηριζόμενες μέθοδοι για πολυπλεξία συνδέσεων είναι το epoll, το kqueue, το /dev/poll και το select. Για την πολυπλεξία σύνδεσης, χρησιμοποιείται η βιβλιοθήκη libuv, η οποία είναι ένα πρόσθετο για το libev σε συστήματα Unix και το IOCP στα Windows. Η βιβλιοθήκη libeio χρησιμοποιείται για τη δημιουργία μιας ομάδας νημάτων και το c-ares είναι ενσωματωμένο για την εκτέλεση ερωτημάτων DNS σε λειτουργία μη αποκλεισμού. Όλες οι κλήσεις συστήματος που προκαλούν μπλοκάρισμα εκτελούνται μέσα στο νήμα και στη συνέχεια, όπως οι χειριστές σήματος, μεταφέρουν το αποτέλεσμα της εργασίας τους πίσω μέσω ενός ανώνυμου σωλήνα (pipe). Η εκτέλεση του κώδικα JavaScript παρέχεται μέσω της χρήσης της μηχανής V8 που αναπτύχθηκε από την Google (επιπλέον, η Microsoft αναπτύσσει μια έκδοση του Node.js με τη μηχανή Chakra-Core).

Στον πυρήνα του, το Node.js είναι παρόμοιο με τα πλαίσια Perl AnyEvent, Ruby Event Machine, Python Twisted και την υλοποίηση συμβάντων Tcl, αλλά ο βρόχος συμβάντος στο Node.js είναι κρυμμένος από τον προγραμματιστή και μοιάζει με τον χειρισμό συμβάντων σε μια εφαρμογή Ιστού που εκτελείται στο πρόγραμμα περιήγησης. Όταν γράφετε εφαρμογές για το node.js, πρέπει να λάβετε υπόψη τις ιδιαιτερότητες του προγραμματισμού που βασίζεται σε συμβάντα, για παράδειγμα, αντί να κάνετε "var result = db.query("select..");" με την αναμονή για την ολοκλήρωση της εργασίας και την επακόλουθη επεξεργασία των αποτελεσμάτων, το Node.js χρησιμοποιεί την αρχή της ασύγχρονης εκτέλεσης, δηλ. ο κώδικας μετατρέπεται σε "db.query("επιλογή..", συνάρτηση (αποτέλεσμα) {επεξεργασία αποτελεσμάτων});", στην οποία ο έλεγχος θα περάσει αμέσως σε περαιτέρω κώδικα και το αποτέλεσμα του ερωτήματος θα υποβληθεί σε επεξεργασία καθώς φτάνουν τα δεδομένα.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο