035.1 Μάθημα 1
Πιστοποιητικό: |
Web Development Essentials |
---|---|
Έκδοση: |
1.0 |
Θέμα: |
035 Προγραμματισμός Node.js Server |
Σκοπός: |
035.1 Βασικά Στοιχεία του Node.js |
Μάθημα: |
1 απο 1 |
Εισαγωγή
Το Node.js είναι ένα περιβάλλον εκτέλεσης JavaScript, που εκτελεί κώδικα JavaScript σε web servers–το λεγόμενο web backend (από την πλευρά του server)–αντί να χρησιμοποιεί μια δεύτερη γλώσσα όπως η Python ή η Ruby για προγράμματα από την πλευρά του server. Η γλώσσα JavaScript χρησιμοποιείται ήδη στη σύγχρονη frontend πλευρά των web εφαρμογών, αλληλεπιδρώντας με το HTML και το CSS του interface που αλληλεπιδρά ο χρήστης με ένα πρόγραμμα περιήγησης ιστού. Η χρήση του Node.js σε συνδυασμό με το JavaScript στο πρόγραμμα περιήγησης προσφέρει τη δυνατότητα μιας μόνο γλώσσας προγραμματισμού για ολόκληρη την εφαρμογή.
Ο κύριος λόγος για την ύπαρξη του Node.js είναι ο τρόπος που χειρίζεται πολλαπλές ταυτόχρονες συνδέσεις στο backend. Ένας από τους πιο συνηθισμένους τρόπους με τους οποίους ένας server web εφαρμογών χειρίζεται συνδέσεις είναι μέσω της εκτέλεσης πολλαπλών processes. Όταν ανοίγετε μια εφαρμογή desktop στον υπολογιστή σας, ξεκινά ;ένα process και χρησιμοποιεί πολλούς πόρους. Τώρα σκεφτείτε πως χιλιάδες χρήστες κάνουν το ίδιο πράγμα σε μια μεγάλη εφαρμογή web.
Το Node.js αποφεύγει αυτό το πρόβλημα χρησιμοποιώντας μια σχεδίαση που ονομάζεται event loop, η οποία είναι ένα εσωτερικό loop που ελέγχει συνεχώς τις εισερχόμενες εργασίες που πρέπει να υπολογιστούν. Χάρη στην ευρεία χρήση της JavaScript και την πανταχού παρουσία των web τεχνολογιών, το Node.js έχει γνωρίσει τεράστια υιοθέτηση τόσο σε μικρές όσο και σε μεγάλες εφαρμογές. Υπάρχουν και άλλα χαρακτηριστικά που βοήθησαν επίσης το Node.js να υιοθετηθεί ευρέως, όπως η ασύγχρονη και μη αποκλειστική επεξεργασία input/output (I/O), η οποία εξηγείται αργότερα σε αυτό το μάθημα.
Το περιβάλλον Node.js χρησιμοποιεί ένα JavaScript engine για την ερμηνεία και την εκτέλεση κώδικα JavaScript στην πλευρά του server ή του desktop. Υπό αυτές τις συνθήκες, ο κώδικας JavaScript που γράφει ο προγραμματιστής αναλύεται και γίνεται compiled έγκαιρα για να εκτελεστούν τα machine instructions που δημιουργούνται από τον αρχικό κώδικα JavaScript.
Note
|
Καθώς προχωράτε σε αυτά τα μαθήματα σχετικά με το Node.js, μπορεί να παρατηρήσετε ότι η JavaScript Node.js δεν είναι ακριβώς η ίδια με αυτή που εκτελείται στο πρόγραμμα περιήγησης (το οποίο ακολουθεί το ECMAScript specification), αλλά είναι αρκετά παρόμοια. |
Ξεκινώντας
Αυτή η ενότητα και τα ακόλουθα παραδείγματα υποθέτουν ότι το Node.js είναι ήδη εγκατεστημένο στο λειτουργικό σας σύστημα Linux και ότι ο χρήστης έχει ήδη βασικές γνώσεις, όπως πώς να εκτελεί εντολές στο terminal.
Για να εκτελέσετε τα ακόλουθα παραδείγματα, δημιουργήστε έναν φάκελο εργασίας που ονομάζεται node_examples
. Ανοίξτε ένα terminal και πληκτρολογήστε node
. Εάν έχετε εγκαταστήσει σωστά το Node.js, θα εμφανίσει ένα >
prompt όπου μπορείτε να δοκιμάσετε εντολές JavaScript διαδραστικά. Αυτό το είδος περιβάλλοντος ονομάζεται REPL, για “read, evaluate, print, and loop”. Πληκτρολογήστε το ακόλουθο input (ή κάποια άλλα JavaScript statements) στο >
prompt. Πατήστε το πλήκτρο Enter μετά από κάθε γραμμή και το περιβάλλον REPL θα επιστρέψει τα αποτελέσματα των ενεργειών του:
> let array = ['a', 'b', 'c', 'd']; undefined > array.map( (element, index) => (`Element: ${element} at index: ${index}`)); [ 'Element: a at index: 0', 'Element: b at index: 1', 'Element: c at index: 2', 'Element: d at index: 3' ] >
Το απόσπασμα γράφτηκε χρησιμοποιώντας τη σύνταξη ES6, η οποία προσφέρει ένα map function για επανάληψη επί του array και εκτύπωση των αποτελεσμάτων χρησιμοποιώντας string templates. Μπορείτε να γράψετε σχεδόν οποιαδήποτε εντολή είναι έγκυρη. Για έξοδο από το Node.js terminal, πληκτρολογήστε .exit
, θυμηθείτε να συμπεριλάβετε την αρχική περίοδο.
Για μεγαλύτερα scripts και modules, είναι πιο βολικό να χρησιμοποιείτε ένα πρόγραμμα επεξεργασίας κειμένου όπως το VS Code, το Emacs ή το Vim. Μπορείτε να αποθηκεύσετε τις δύο γραμμές κώδικα που μόλις εμφανίστηκαν (με μια μικρή τροποποίηση) σε ένα αρχείο που ονομάζεται start.js
:
let array = ['a', 'b', 'c', 'd'];
array.map( (element, index) => ( console.log(`Element: ${element} at index: ${index}`)));
Στη συνέχεια, μπορείτε να εκτελέσετε το script από το shell για να δημιουργήσετε τα ίδια αποτελέσματα όπως πριν:
$ node ./start.js Element: a at index: 0 Element: b at index: 1 Element: c at index: 2 Element: d at index: 3
Πριν βουτήξουμε σε περισσότερο κώδικα, θα δσύμε μια επισκόπηση του τρόπου λειτουργίας του Node.js, χρησιμοποιώντας το περιβάλλον εκτέλεσης μεμονωμένου thread και το event loop.
Event Loop και Μεμονωμένο Thread
Είναι δύσκολο να πούμε πόσο χρόνο θα χρειαστεί το Node.js πρόγραμμά σας, για να χειριστεί ένα request. Ορισμένα requests μπορεί να είναι σύντομα—ίσως απλώς να κάνουν loop μέσω μεταβλητών στη μνήμη και να τις επιστρέφουν—ενώ άλλες μπορεί να απαιτούν χρονοβόρες δραστηριότητες όπως το άνοιγμα ενός αρχείου στο σύστημα ή η έκδοση ενός query σε μια βάση δεδομένων και η αναμονή για τα αποτελέσματα. Πώς χειρίζεται το Node.js αυτήν την αβεβαιότητα; Το event loop είναι η απάντηση.
Φανταστείτε έναν μάγειρα να κάνει πολλές εργασίες. Το ψήσιμο ενός κέικ είναι μια εργασία που απαιτεί πολύ χρόνο για να το ψήσει ο φούρνος. Ο μάγειρας δεν μένει εκεί περιμένοντας να είναι έτοιμο το κέικ και μετά να ξεκινήσει να φτιάξει καφέ. Αντίθετα, ενώ ο φούρνος ψήνει το κέικ, ο μάγειρας φτιάχνει καφέ και κάνει άλλες εργασίες παράλληλα. Αλλά ο μάγειρας πάντα ελέγχει αν είναι η κατάλληλη στιγμή να αλλάξει την προσοχή του σε μια συγκεκριμένη εργασία (φτιάξιμο καφέ) ή να βγάλει το κέικ από τον φούρνο.
Το event loop μοιάζει με τον μάγειρα που έχει διαρκώς επίγνωση των γύρω δραστηριοτήτων. Στο Node.js, ένας “event-checker” ελέγχει πάντα για λειτουργίες που έχουν ολοκληρωθεί ή περιμένουν να υποβληθούν σε επεξεργασία από το JavaScript engine.
Χρησιμοποιώντας αυτήν την προσέγγιση, μια ασύγχρονη και μεγάλης διάρκειας λειτουργία δεν εμποδίζει άλλες πιο γρήγορες λειτουργίες που ακολουθούν. Αυτό συμβαίνει επειδή ο μηχανισμός event loop ελέγχει πάντα εάν αυτή η μεγάλης διάρκειας εργασία, όπως μια λειτουργία I/O, έχει ήδη ολοκληρωθεί. Εάν όχι, το Node.js μπορεί να συνεχίσει να επεξεργάζεται άλλες εργασίες. Μόλις ολοκληρωθεί η backround εργασία, τα αποτελέσματα επιστρέφονται και η εφαρμογή πάνω από το Node.js μπορεί να χρησιμοποιήσει ένα trigger function (callback) για περαιτέρω επεξεργασία του output.
Επειδή το Node.js αποφεύγει τη χρήση πολλαπλών threads, όπως κάνουν και άλλα περιβάλλοντα, ονομάζεται περιβάλλον μεμονωμένου thread, και επομένως μια προσέγγιση μη αποκλεισμού είναι υψίστης σημασίας. Αυτός είναι ο λόγος για τον οποίο το Node.js χρησιμοποιεί έναν event loop. Ωστόσο, για εργασίες υπολογιστικής εντάσεως , το Node.js δεν συγκαταλέγεται στα καλύτερα εργαλεία, ωστόσο υπάρχουν άλλες γλώσσες προγραμματισμού και περιβάλλοντα που αντιμετωπίζουν αυτά τα προβλήματα πιο αποτελεσματικά.
Στις επόμενες ενότητες, θα ρίξουμε μια πιο προσεκτική ματιά στα callback functions. Προς το παρόν, κατανοήστε ότι τα callback functions είναι triggers που εκτελούνται με την ολοκλήρωση μιας προκαθορισμένης λειτουργίας.
Modules
Η διάσπαση πολύπλοκων λειτουργιών και εκτεταμένων κομματιών κώδικα σε μικρότερα μέρη, αποτελεί βέλτιστη πρακτική. Η δημιουργία αυτής της αρθρωτής μορφής [modularization] βοηθά στην καλύτερη οργάνωση της βάσης του κώδικα, στην αφηρημενοποίηση των υλοποιήσεων και στην αποφυγή περίπλοκων προβλημάτων μηχανικής. Για να καλύψουν αυτές τις ανάγκες, οι προγραμματιστές συσκευάζουν κομμάτια source code που θα καταναλωθούν από άλλα εσωτερικά ή εξωτερικά μέρη του κώδικα.
Εξετάστε το παράδειγμα ενός προγράμματος που υπολογίζει τον όγκο μιας σφαίρας. Ανοίξτε το πρόγραμμα επεξεργασίας κειμένου και δημιουργήστε ένα αρχείο με το όνομα volumeCalculator.js
που περιέχει την ακόλουθη JavaScript:
const sphereVol = (radius) => {
return 4 / 3 * Math.PI * radius
}
console.log(`A sphere with radius 3 has a ${sphereVol(3)} volume.`);
console.log(`A sphere with radius 6 has a ${sphereVol(6)} volume.`);
Τώρα, εκτελέστε το αρχείο χρησιμοποιώντας το Node:
$ node volumeCalculator.js A sphere with radius 3 has a 113.09733552923254 volume. A sphere with radius 6 has a 904.7786842338603 volume.
Εδώ, ένα απλό function χρησιμοποιήθηκε για τον υπολογισμό του όγκου μιας σφαίρας, με βάση την ακτίνα της. Φανταστείτε ότι πρέπει επίσης να υπολογίσουμε τον όγκο ενός κυλίνδρου, ενός κώνου και ούτω καθεξής. Παρατηρούμε γρήγορα ότι αυτά τα συγκεκριμένα functions πρέπει να προστεθούν στο αρχείο volumeCalculator.js
, το οποίο μπορεί να γίνει μια τεράστια συλλογή functions. Για να οργανώσουμε καλύτερα τη δομή, μπορούμε να χρησιμοποιήσουμε την ιδέα πίσω από τα modules ως πακέτα διαχωρισμένου κώδικα.
Για να το κάνετε αυτό, δημιουργήστε ένα ξεχωριστό αρχείο που ονομάζεται polyhedrons.j
:
const coneVol = (radius, height) => {
return 1 / 3 * Math.PI * Math.pow(radius, 2) * height;
}
const cylinderVol = (radius, height) => {
return Math.PI * Math.pow(radius, 2) * height;
}
const sphereVol = (radius) => {
return 4 / 3 * Math.PI * Math.pow(radius, 3);
}
module.exports = {
coneVol,
cylinderVol,
sphereVol
}
Τώρα, στο αρχείο volumeCalculator.js
, διαγράψτε τον παλιό κώδικα και αντικαταστήστε τον με αυτό το απόσπασμα:
const polyhedrons = require('./polyhedrons.js');
console.log(`A sphere with radius 3 has a ${polyhedrons.sphereVol(3)} volume.`);
console.log(`A cylinder with radius 3 and height 5 has a ${polyhedrons.cylinderVol(3, 5)} volume.`);
console.log(`A cone with radius 3 and height 5 has a ${polyhedrons.coneVol(3, 5)} volume.`);
Στη συνέχεια, εκτελέστε το αρχείο στο περιβάλλον Node.js:
$ node volumeCalculator.js A sphere with radius 3 has a 113.09733552923254 volume. A cylinder with radius 3 and height 5 has a 141.3716694115407 volume. A cone with radius 3 and height 5 has a 47.12388980384689 volume.
Στο περιβάλλον Node.js, κάθε αρχείο source code θεωρείται ένα module, αλλά η λέξη “module” στο Node.js υποδηλώνει ένα πακέτο κώδικα που έχει συνθετηθεί όπως στο προηγούμενο παράδειγμα. Χρησιμοποιώντας modules, κάναμε τα functions όγκου αφηρημένα, μακριά από το κύριο αρχείο, volumeCalculator.js
, μειώνοντας έτσι το μέγεθός του και διευκολύνοντας την εφαρμογή unit tests, που αποτελούν καλή πρακτική κατά την ανάπτυξη εφαρμογών σε περιβάλλον παραγωγής.
Τώρα που γνωρίζουμε πώς χρησιμοποιούνται τα modules στο Node.js, μπορούμε να χρησιμοποιήσουμε ένα από τα πιο σημαντικά εργαλεία: το Node Package Manager (NPM).
Μία από τις κύριες εργασίες του NPM είναι η διαχείριση, η λήψη και η εγκατάσταση εξωτερικών modules στο project ή στο λειτουργικό σύστημα. Μπορείτε να αρχικοποιήσετε ένα node repository με την εντολή npm init
.
Το NPM θα κάνει τις προεπιλεγμένες ερωτήσεις σχετικά με το όνομα του repository σας, την έκδοση, την περιγραφή και ούτω καθεξής. Μπορείτε να παρακάμψετε αυτά τα βήματα χρησιμοποιώντας το npm init --yes
και η εντολή θα δημιουργήσει αυτόματα ένα αρχείο package.json
που περιγράφει τις ιδιότητες του project/module σας.
Ανοίξτε το αρχείο package.json
στον αγαπημένο σας επεξεργαστή κειμένου και θα δείτε ένα αρχείο JSON που περιέχει ιδιότητες όπως λέξεις-κλειδιά, εντολές script για χρήση με το NPM, ένα όνομα κ.λπ.
Μία από αυτές τις ιδιότητες είναι τα dependencies που είναι εγκατεστημένα στο τοπικό σας repository. Το NPM θα προσθέσει το όνομα και την έκδοση αυτών των dependencies στο package.json
, μαζί με το package-lock.json
, ένα άλλο αρχείο που χρησιμοποιείται ως εναλλακτικό αρχείο από το NPM σε περίπτωση που αποτύχει το package.json
.
Πληκτρολογήστε τα ακόλουθα στο terminal σας:
$ npm i dayjs
Το flag i
είναι μια συντόμευση για το argument install
. Εάν είστε συνδεδεμένοι στο διαδίκτυο, το NPM θα αναζητήσει ένα module με το όνομα dayjs
στο απομακρυσμένο repository του Node.js, θα πραγματοποιήσει λήψη του module και θα την εγκαταστήσει τοπικά. Το NPM θα προσθέσει επίσης αυτό το dependency στα αρχεία σας package.json
και package-lock.json
. Τώρα μπορείτε να δείτε ότι υπάρχει ένας φάκελος που ονομάζεται node_modules
, ο οποίος περιέχει το εγκατεστημένο module μαζί με άλλα modules, εάν χρειάζονται. Ο φάκελος node_modules
περιέχει τον πραγματικό κώδικα που πρόκειται να χρησιμοποιηθεί κατά την εισαγωγή και την κλήση του library. Ωστόσο, αυτός ο φάκελος δεν αποθηκεύεται σε συστήματα έλεγχου έκδοσης κώδικα που χρησιμοποιούν Git, καθώς το αρχείο package.json
παρέχει όλες τις dependencies που χρησιμοποιούνται. Ένας άλλος χρήστης μπορεί να πάρει το αρχείο package.json
και απλώς να εκτελέσει το npm install
στον δικό του υπολογιστή, όπου το NPM θα δημιουργήσει έναν φάκελο node_modules
με όλα τα dependencies στο package.json
, αποφεύγοντας έτσι τον έλεγχο έκδοσης για το χιλιάδες αρχεία διαθέσιμα στο repository NPM.
Τώρα που το module dayjs
είναι εγκατεστημένο στον τοπικό φάκελο, ανοίξτε την κονσόλα Node.js και πληκτρολογήστε τις ακόλουθες γραμμές:
const dayjs = require('dayjs');
dayjs().format('YYYY MM-DDTHH:mm:ss')
Το module dayjs
φορτώνεται με τη λέξη-κλειδί require
. Όταν καλείται μια μέθοδος από το module, το library παίρνει την τρέχουσα ώρα ημερομηνίας του συστήματος και την εξάγει στην καθορισμένη μορφή:
2020 11-22T11:04:36
Αυτός είναι ο ίδιος μηχανισμός που χρησιμοποιήθηκε στο προηγούμενο παράδειγμα, όπου το περιβάλλον εκτέλεσης του Node.js φορτώνει το function ενός τρίτου μέρους στον κώδικα.
Λειτουργικότητα Server
Επειδή το Node.js ελέγχει το backend των web εφαρμογών, μία από τις βασικές του εργασίες είναι να χειρίζεται HTTP requests.
Ακολουθεί μια σύνοψη του τρόπου με τον οποίο οι web servers χειρίζονταν τα εισερχόμενα HTTP requests. Η λειτουργικότητα του server είναι να ακούει για requests, να καθορίζει όσο το δυνατόν γρηγορότερα ποιο response χρειάζεται το καθένα και να επιστρέφει αυτήν την απάντηση στον αποστολέα του request. Αυτή η εφαρμογή πρέπει να λάβει ένα εισερχόμενο HTTP request που ενεργοποιείται από τον χρήστη, να αναλύσει το request, να εκτελέσει τον υπολογισμό, να δημιουργήσει το response και να το στείλει πίσω. Χρησιμοποιείται ένα HTTP module όπως το Node.js επειδή απλοποιεί αυτά τα βήματα, επιτρέποντας σε έναν web προγραμματιστή να εστιάσει στην ίδια την εφαρμογή.
Εξετάστε το ακόλουθο παράδειγμα που υλοποιεί αυτήν την πολύ βασική λειτουργία:
const http = require('http');
const url = require('url');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
const queryObject = url.parse(req.url,true).query;
let result = parseInt(queryObject.a) + parseInt(queryObject.b);
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end(`Result: ${result}\n`);
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Αποθηκεύστε αυτά τα περιεχόμενα σε ένα αρχείο που ονομάζεται basic_server.js
και εκτελέστε το μέσω μιας εντολής node
. Το terminal που εκτελεί το Node.js θα εμφανίσει το ακόλουθο μήνυμα:
Server running at http://127.0.0.1:3000/
Στη συνέχεια, επισκεφτείτε την ακόλουθη διεύθυνση URL στο πρόγραμμα περιήγησής σας στον ιστό: http://127.0.0.1:3000/numbers?a=2&b=17
Το Node.js τρέχει έναν web server στον υπολογιστή σας και χρησιμοποιεί δύο modules: http
και url
. Το http
module δημιουργεί έναν βασικό HTTP server, που επεξεργάζεται τα εισερχόμενα web requests και τα παραδίδει στον απλό κώδικα της εφαρμογής μας. Το URL module αναλύει τα arguments που διαβιβάζονται στη διεύθυνση URL, τα μετατρέπει σε μορφή ακέραιου αριθμού και εκτελεί τη πράξη της πρόσθεσης. Στη συνέχεια, το http
module στέλνει την απάντηση ως κείμενο στο πρόγραμμα περιήγησης.
Σε μια πραγματική web εφαρμογή, το Node.js χρησιμοποιείται συνήθως για την επεξεργασία και την ανάκτηση δεδομένων, συνήθως από μια βάση δεδομένων, και την επιστροφή των επεξεργασμένων πληροφοριών στο frontend προς εμφάνιση. Αλλά η βασική εφαρμογή σε αυτό το μάθημα δείχνει συνοπτικά πώς το Node.js χρησιμοποιεί modules για να χειρίζεται web requests ως web server.
Καθοδηγούμενες Ασκήσεις
-
Ποιοι είναι οι λόγοι για να χρησιμοποιείτε modules αντί να γράφετε απλά functions;
-
Γιατί το περιβάλλον Node.js έγινε τόσο δημοφιλές; Αναφέρετε ένα χαρακτηριστικό.
-
Ποιος είναι ο σκοπός του αρχείου
package.json
; -
Γιατί δεν συνιστάται η αποθήκευση και κοινή χρήση του φακέλου
node_modules
;
Ασκήσεις Εξερεύνησης
-
Πώς μπορείτε να εκτελέσετε εφαρμογές Node.js στον υπολογιστή σας;
-
Πώς μπορείτε να οριοθετήσετε τις παραμέτρους στη URL διεύθυνση, για ανάλυση απο το server;
-
Καθορίστε ένα σενάριο όπου μια συγκεκριμένη εργασία θα μπορούσε να αποτελέσει εμπόδιο για μια εφαρμογή Node.js.
-
Πώς θα εφαρμόζατε μια παράμετρο για να πολλαπλασιάσετε ή να αθροίσετε τους δύο αριθμούς στο παράδειγμα με το server;
Σύνοψη
Αυτό το μάθημα παρείχε μια επισκόπηση του περιβάλλοντος Node.js, των χαρακτηριστικών του και πώς μπορεί να χρησιμοποιηθεί για την υλοποίηση απλών προγραμμάτων. Αυτό το μάθημα περιλαμβάνει τις ακόλουθες έννοιες:
-
Τι είναι το Node.js και γιατί χρησιμοποιείται.
-
Πώς να εκτελέσετε προγράμματα Node.js χρησιμοποιώντας τη γραμμή εντολών.
-
Τα event loops και το μεμονωμένο thread.
-
Modules.
-
Node Package Manager (NPM).
-
Λειτουργικότητα server.
Απαντήσεις στις Καθοδηγούμενες Ασκήσεις
-
Ποιοι είναι οι λόγοι για να χρησιμοποιείτε modules αντί να γράφετε απλά functions;
Επιλέγοντας modules αντί για τα συμβατικά functions, ο προγραμματιστής δημιουργεί μια απλούστερη βάση κώδικα για ανάγνωση και συντήρηση και για τη σύνταξη αυτοματοποιημένων δοκιμών.
-
Γιατί το περιβάλλον Node.js έγινε τόσο δημοφιλές; Αναφέρετε ένα χαρακτηριστικό.
Ένας λόγος είναι η ευελιξία της γλώσσας JavaScript, η οποία χρησιμοποιούταν ήδη ευρέως στο frontend των web εφαρμογών. Το Node.js επιτρέπει τη χρήση μόνο μιας γλώσσας προγραμματισμού σε ολόκληρο το σύστημα.
-
Ποιος είναι ο σκοπός του αρχείου
package.json
;Αυτό το αρχείο περιέχει metadata για το project, όπως το όνομα, την έκδοση, τα dependencies (libraries) και ούτω καθεξής. Με δεδομένο ένα αρχείο
package.json
, άλλα άτομα μπορούν να κατεβάσουν και να εγκαταστήσουν τα ίδια libraries και να εκτελέσουν δοκιμές με τον ίδιο τρόπο που έκανε ο δημιουργός του. -
Γιατί δεν συνιστάται η αποθήκευση και κοινή χρήση του φακέλου
node_modules
;Ο φάκελος
node_modules
περιέχει τις υλοποιήσεις των libraries που είναι διαθέσιμες σε απομακρυσμένα repositories. Επομένως, ο καλύτερος τρόπος για να μοιραστείτε αυτά τα libraries είναι να τα υποδείξετε στο αρχείοpackage.json
και στη συνέχεια να χρησιμοποιήσετε το NPM για τη λήψη αυτών των libraries. Αυτή η μέθοδος είναι απλούστερη και χωρίς λιγότερο επιρρεπής σε σφάλματα, επειδή δεν χρειάζεται να παρακολουθείτε και να διατηρείτε τα libraries τοπικά.
Απαντήσεις στις Ασκήσεις Εξερεύνησης
-
Πώς μπορείτε να εκτελέσετε εφαρμογές Node.js στον υπολογιστή σας;
Μπορείτε να τις εκτελέσετε πληκτρολογώντας
node PATH/FILE_NAME.js
στη γραμμή εντολών στο terminal, αλλάζοντας τοPATH
στο path του αρχείου Node.js και αλλάζοντας τοFILE_NAME.js
στο όνομα αρχείου που έχετε επιλέξει. -
Πώς μπορείτε να οριοθετήσετε τις παραμέτρους στη URL διεύθυνση, για ανάλυση απο το server;
Ο χαρακτήρας
&
χρησιμοποιείται για την οριοθέτηση αυτών των παραμέτρων, έτσι ώστε να μπορούν να εξαχθούν και να αναλυθούν στον κώδικα JavaScript. -
Καθορίστε ένα σενάριο όπου μια συγκεκριμένη εργασία θα μπορούσε να αποτελέσει εμπόδιο για μια εφαρμογή Node.js.
Το Node.js δεν είναι ένα καλό περιβάλλον για την εκτέλεση processes οι οποίες κάνουν εντατική χρήση της CPU, επειδή χρησιμοποιεί ένα μόνο thread. Ένα σενάριο αριθμητικού υπολογισμού θα μπορούσε να επιβραδύνει και να κλειδώσει ολόκληρη την εφαρμογή. Εάν χρειάζεται αριθμητική προσομοίωση, είναι προτιμότερο να χρησιμοποιήσετε άλλα εργαλεία.
-
Πώς θα εφαρμόζατε μια παράμετρο για να πολλαπλασιάσετε ή να αθροίσετε τους δύο αριθμούς στο παράδειγμα με το server;
Χρησιμοποιήστε έναν ternary [τριαδικό] τελεστή ή μια συνθήκη if-else για να ελέγξετε για μια πρόσθετη παράμετρο. Εάν η παράμετρος είναι το string
mult
επιστρέψτε το γινόμενο των αριθμών, διαφορετικά επιστρέψτε το άθροισμα. Αντικαταστήστε τον παλιό κώδικα με το παρακάτω απόσπασμα. Κάντε επανεκκίνηση του server στη γραμμή εντολών πατώντας kbd:[Ctrl+C] και εκτελέστε ξανά την εντολή για επανεκκίνηση του server. Τώρα δοκιμάστε τη νέα εφαρμογή μεταβαίνοντας στη διεύθυνση URLhttp://127.0.0.1:3000/numbers?a=2&b=17&operation=mult
στο πρόγραμμα περιήγησής σας. Εάν παραλείψετε ή αλλάξετε την τελευταία παράμετρο, τα αποτελέσματα θα πρέπει να είναι το άθροισμα των αριθμών.let result = queryObject.operation == 'mult' ? parseInt(queryObject.a) * parseInt(queryObject.b) : parseInt(queryObject.a) + parseInt(queryObject.b);