Όταν δημιουργείτε ένα back-end για ένα REST API, το Express.js είναι συχνά η πρώτη επιλογή μεταξύ των πλαισίων Node.js. Ενώ υποστηρίζει επίσης τη δημιουργία στατικού HTML και προτύπων, σε αυτήν τη σειρά, θα επικεντρωθούμε στην ανάπτυξη back-end χρησιμοποιώντας TypeScript. Το προκύπτον REST API θα είναι εκείνο που θα μπορούσε να υποβάλει ερώτημα για οποιοδήποτε πλαίσιο front-end ή εξωτερική υπηρεσία back-end.
Θα χρειαστείς:
κατάσταση ταμειακών ροών από τον ισολογισμό
Σε ένα τερματικό (ή μια γραμμή εντολών), θα δημιουργήσουμε έναν φάκελο για το έργο. Από αυτόν το φάκελο, εκτελέστε npm init
. Αυτό θα δημιουργήσει μερικά από τα βασικά αρχεία έργου Node.js που χρειαζόμαστε.
Στη συνέχεια, θα προσθέσουμε το πλαίσιο Express.js και μερικές χρήσιμες βιβλιοθήκες:
npm install --save express debug winston express-winston cors
Υπάρχουν καλοί λόγοι για αυτές τις βιβλιοθήκες Προγραμματιστής Node.js αγαπημένα:
debug
είναι μια ενότητα που θα χρησιμοποιήσουμε για να αποφύγουμε την κλήση console.log()
κατά την ανάπτυξη της εφαρμογής μας. Με αυτόν τον τρόπο, μπορούμε εύκολα να φιλτράρουμε τις εντολές εντοπισμού σφαλμάτων κατά την αντιμετώπιση προβλημάτων. Μπορούν επίσης να απενεργοποιηθούν εντελώς στην παραγωγή αντί να πρέπει να αφαιρεθούν χειροκίνητα.winston
είναι υπεύθυνη για την καταγραφή αιτημάτων στο API μας και την επιστροφή των απαντήσεων (και των σφαλμάτων). express-winston
ενσωματώνεται απευθείας με το Express.js, έτσι ώστε όλα τα τυπικά API που σχετίζονται με winston
ο κωδικός καταγραφής έχει ήδη γίνει.cors
είναι ένα κομμάτι του middleware Express.js που μας επιτρέπει να ενεργοποιήσουμε διαμοιρασμός πόρων πολλαπλής προέλευσης . Χωρίς αυτό, το API μας θα μπορούσε να χρησιμοποιηθεί μόνο από τις διεπαφές που εξυπηρετούνται από τον ίδιο ακριβώς υποτομέα με το back-end μας.Το πίσω μέρος μας χρησιμοποιεί αυτά τα πακέτα όταν εκτελείται. Αλλά πρέπει επίσης να εγκαταστήσουμε μερικά ανάπτυξη εξαρτήσεις για τη διαμόρφωση TypeScript. Για αυτό, θα τρέξουμε:
npm install --save-dev @types/cors @types/express @types/debug source-map-support tslint typescript
Αυτές οι εξαρτήσεις απαιτούνται για την ενεργοποίηση του TypeScript για τον δικό μας κώδικα της εφαρμογής μας, μαζί με τους τύπους που χρησιμοποιούνται από το Express.js και άλλες εξαρτήσεις. Αυτό μπορεί να εξοικονομήσει πολύ χρόνο όταν χρησιμοποιούμε ένα IDE όπως το WebStorm ή τον VSCode, επιτρέποντάς μας να ολοκληρώσουμε μερικές μεθόδους λειτουργίας αυτόματα κατά την κωδικοποίηση.
Οι τελικές εξαρτήσεις σε package.json
πρέπει να είναι έτσι:
'dependencies': { 'debug': '^4.2.0', 'express': '^4.17.1', 'express-winston': '^4.0.5', 'winston': '^3.3.3', 'cors': '^2.8.5' }, 'devDependencies': { '@types/cors': '^2.8.7', '@types/debug': '^4.1.5', '@types/express': '^4.17.2', 'source-map-support': '^0.5.16', 'tslint': '^6.0.0', 'typescript': '^3.7.5' }
Τώρα που έχουμε εγκαταστήσει όλες τις απαιτούμενες εξαρτήσεις μας, ας αρχίσουμε να δημιουργούμε τον δικό μας κώδικα!
Για αυτό το σεμινάριο, πρόκειται να δημιουργήσουμε μόνο τρία αρχεία:
./app.ts
./common/common.routes.config.ts
./users/users.routes.config.ts
Η ιδέα πίσω από τους δύο φακέλους της δομής του έργου (common
και users
) είναι να υπάρχουν μεμονωμένες ενότητες που έχουν τις δικές τους ευθύνες. Υπό αυτήν την έννοια, θα έχουμε τελικά κάποια ή όλα τα ακόλουθα για κάθε ενότητα:
Αυτή η δομή φακέλων παρέχει ένα αρχικό σημείο εκκίνησης για το υπόλοιπο αυτής της σειράς μαθημάτων και αρκετό για να ξεκινήσετε την εξάσκηση.
Στο common
φάκελο, ας δημιουργήσουμε το common.routes.config.ts
αρχείο για να μοιάζει με το ακόλουθο:
import express from 'express'; export class CommonRoutesConfig { app: express.Application; name: string; constructor(app: express.Application, name: string) { this.app = app; this.name = name; } getName() { return this.name; } }
Ο τρόπος με τον οποίο δημιουργούμε τις διαδρομές εδώ είναι προαιρετικός. Επειδή όμως δουλεύουμε με το TypeScript, το σενάριο διαδρομών μας είναι μια ευκαιρία να εξασκηθούμε στη χρήση κληρονομιάς με το extends
λέξη-κλειδί, όπως θα δούμε σύντομα. Σε αυτό το έργο, όλα τα αρχεία διαδρομής έχουν την ίδια συμπεριφορά: Έχουν ένα όνομα (το οποίο θα χρησιμοποιήσουμε για σκοπούς εντοπισμού σφαλμάτων) και πρόσβαση στο κύριο Express.js Application
αντικείμενο.
Τώρα, μπορούμε να αρχίσουμε να δημιουργούμε το αρχείο διαδρομής των χρηστών. Στο users
φάκελο, ας δημιουργήσουμε users.routes.config.ts
και αρχίστε να τον κωδικοποιείτε έτσι:
import {CommonRoutesConfig} from '../common/common.routes.config'; import express from 'express'; export class UsersRoutes extends CommonRoutesConfig { constructor(app: express.Application) { super(app, 'UsersRoutes'); } }
Εδώ, εισάγουμε το CommonRoutesConfig
τάξη και επέκταση στη νέα μας τάξη, που ονομάζεται UsersRoutes
. Με τον κατασκευαστή, στέλνουμε την εφαρμογή (το κύριο express.Application
αντικείμενο) και το όνομα UsersRoutes στον κατασκευαστή CommonRoutesConfig
.
Αυτό το παράδειγμα είναι αρκετά απλό, αλλά κατά την κλιμάκωση για τη δημιουργία πολλών αρχείων διαδρομής, αυτό θα μας βοηθήσει να αποφύγουμε τον διπλό κώδικα.
Ας υποθέσουμε ότι θα θέλαμε να προσθέσουμε νέες δυνατότητες σε αυτό το αρχείο, όπως καταγραφή. Θα μπορούσαμε να προσθέσουμε το απαραίτητο πεδίο στο CommonRoutesConfig
τάξη και έπειτα όλες οι διαδρομές που επεκτείνονται CommonRoutesConfig
θα έχει πρόσβαση σε αυτό.
Τι γίνεται αν θέλουμε να έχουμε κάποια λειτουργικότητα παρόμοιος μεταξύ αυτών των τάξεων (όπως η διαμόρφωση των τελικών σημείων API), αλλά αυτό χρειάζεται διαφορετική εφαρμογή για κάθε τάξη; Μια επιλογή είναι να χρησιμοποιήσετε μια λειτουργία TypeScript που ονομάζεται αφαίρεση .
Ας δημιουργήσουμε μια πολύ απλή αφηρημένη συνάρτηση που η UsersRoutes
Η κλάση (και οι μελλοντικές κλάσεις δρομολόγησης) θα κληρονομηθούν από CommonRoutesConfig
. Ας πούμε ότι θέλουμε να αναγκάσουμε όλες τις διαδρομές να έχουν μια λειτουργία (έτσι μπορούμε να την καλέσουμε από τον κοινό κατασκευαστή μας) με το όνομα configureRoutes()
. Εκεί θα δηλώσουμε τα τελικά σημεία του πόρου κάθε κλάσης δρομολόγησης.
Για να γίνει αυτό, θα προσθέσουμε τρία γρήγορα πράγματα στο common.routes.config.ts
:
abstract
στο class
μας γραμμή, για να ενεργοποιηθεί η αφαίρεση για αυτήν την τάξη.abstract configureRoutes(): express.Application;
. Αυτό αναγκάζει οποιαδήποτε κλάση να επεκτείνεται CommonRoutesConfig
για να παρέχει μια εφαρμογή που να ταιριάζει με αυτήν την υπογραφή - αν δεν το κάνει, ο μεταγλωττιστής TypeScript θα εμφανίσει ένα σφάλμα.this.configureRoutes();
στο τέλος του κατασκευαστή, καθώς μπορούμε τώρα να είμαστε σίγουροι ότι αυτή η συνάρτηση θα υπάρχει.Το αποτέλεσμα:
import express from 'express'; export abstract class CommonRoutesConfig { app: express.Application; name: string; constructor(app: express.Application, name: string) { this.app = app; this.name = name; this.configureRoutes(); } getName() { return this.name; } abstract configureRoutes(): express.Application; }
Με αυτό, οποιαδήποτε κλάση επεκτείνεται CommonRoutesConfig
πρέπει να έχει μια συνάρτηση που ονομάζεται configureRoutes()
που επιστρέφει ένα express.Application
αντικείμενο. Αυτό σημαίνει users.routes.config.ts
χρειάζεται ενημέρωση:
import {CommonRoutesConfig} from '../common/common.routes.config'; import express from 'express'; export class UsersRoutes extends CommonRoutesConfig { constructor(app: express.Application) { super(app, 'UsersRoutes'); } configureRoutes() { // (we'll add the actual route configuration here next) return this.app; } }
Ως ανακεφαλαίωση αυτού που έχουμε κάνει:
Πρώτα εισάγουμε το common.routes.config
αρχείο, μετά το express
μονάδα μέτρησης. Στη συνέχεια ορίζουμε το UserRoutes
τάξη, λέγοντας ότι θέλουμε να επεκτείνει το CommonRoutesConfig
βασική κλάση, που σημαίνει ότι υποσχόμαστε ότι θα εφαρμόσει configureRoutes()
.
Για να στείλετε πληροφορίες στο CommonRoutesConfig
τάξη, χρησιμοποιούμε το constructor
της τάξης. Αναμένει να λάβει το express.Application
αντικείμενο, το οποίο θα περιγράψουμε σε μεγαλύτερο βάθος στο επόμενο βήμα. Με το super()
, περνάμε στον κατασκευαστή CommonRoutesConfig
την εφαρμογή και το όνομα των διαδρομών μας, το οποίο σε αυτό το σενάριο είναι UsersRoutes. (super()
, με τη σειρά, θα απαιτήσει την υλοποίησή μας του configureRoutes()
.)
Το configureRoutes()
Η λειτουργία είναι όπου θα δημιουργήσουμε τα τελικά σημεία για τους χρήστες του REST API μας. Εκεί, θα χρησιμοποιήσουμε το εφαρμογή και είναι Διαδρομή λειτουργίες από το Express.js.
Η ιδέα της χρήσης του app.route()
Η λειτουργία είναι να αποφευχθεί η επικάλυψη κώδικα, κάτι που είναι εύκολο αφού δημιουργούμε ένα REST API με καλά καθορισμένους πόρους. Ο κύριος πόρος για αυτό το σεμινάριο είναι χρήστες . Έχουμε δύο περιπτώσεις σε αυτό το σενάριο:
users
στο τέλος της διαδρομής που ζητήσατε. (Σε αυτό το άρθρο δεν θα κάνουμε φιλτράρισμα ερωτημάτων, σελιδοποίηση ή άλλα παρόμοια ερωτήματα.)users/:userId
.Ο τρόπος .route()
λειτουργεί στο Express.js μας επιτρέπει να χειριστούμε ρήματα HTTP με κάποια κομψή αλυσίδα. Αυτό συμβαίνει επειδή .get()
, .post()
, κ.λπ., όλα επιστρέφουν την ίδια παρουσία του IRoute
ότι η πρώτη .route()
η κλήση κάνει. Η τελική διαμόρφωση θα έχει ως εξής:
configureRoutes() { this.app.route(`/users`) .get((req: express.Request, res: express.Response) => { res.status(200).send(`List of users`); }) .post((req: express.Request, res: express.Response) => { res.status(200).send(`Post to users`); }); this.app.route(`/users/:userId`) .all((req: express.Request, res: express.Response, next: express.NextFunction) => { // this middleware function runs before any request to /users/:userId // but it doesn't accomplish anything just yet--- // it simply passes control to the next applicable function below using next() next(); }) .get((req: express.Request, res: express.Response) => { res.status(200).send(`GET requested for id ${req.params.userId}`); }) .put((req: express.Request, res: express.Response) => { res.status(200).send(`PUT requested for id ${req.params.userId}`); }) .patch((req: express.Request, res: express.Response) => { res.status(200).send(`PATCH requested for id ${req.params.userId}`); }) .delete((req: express.Request, res: express.Response) => { res.status(200).send(`DELETE requested for id ${req.params.userId}`); }); return this.app; }
Ο παραπάνω κώδικας επιτρέπει σε οποιονδήποτε πελάτη REST API να καλέσει το users
τελικό σημείο με ένα POST
ή a GET
αίτηση. Παρομοίως, επιτρέπει σε έναν πελάτη να καλέσει το /users/:userId
τελικό σημείο με ένα GET
, PUT
, PATCH
ή DELETE
αίτηση.
Αλλά για /users/:userId
, προσθέσαμε επίσης γενικό μεσαίο λογισμικό χρησιμοποιώντας το all()
συνάρτηση, η οποία θα εκτελεστεί πριν από οποιαδήποτε από τις get()
, put()
, patch()
ή delete()
λειτουργίες. Αυτή η λειτουργία θα είναι επωφελής όταν (αργότερα στη σειρά) δημιουργούμε διαδρομές που προορίζονται να έχουν πρόσβαση μόνο από πιστοποιημένους χρήστες.
πώς να φτιάξετε bot telegram
Ίσως το έχετε παρατηρήσει στο .all()
μας λειτουργία - όπως με οποιοδήποτε κομμάτι του μεσαίου λογισμικού - έχουμε τρεις τύπους πεδίων: Request
, Response
και NextFunction
.
NextFunction
χρησιμεύει ως λειτουργία επιστροφής κλήσης, επιτρέποντας στον έλεγχο να διέρχεται από άλλες λειτουργίες του μεσαίου λογισμικού. Στην πορεία, όλα τα μεσαία προγράμματα θα μοιράζονται τα ίδια αντικείμενα αιτήματος και απόκρισης προτού ο ελεγκτής στείλει τελικά μια απάντηση στον αιτούντα.app.ts
Τώρα που έχουμε διαμορφώσει ορισμένους βασικούς σκελετούς διαδρομής, θα αρχίσουμε να διαμορφώνουμε το σημείο εισόδου της εφαρμογής. Ας δημιουργήσουμε το app.ts
αρχείο στη ρίζα του φακέλου έργου μας και ξεκινήστε με αυτόν τον κωδικό:
import express from 'express'; import * as http from 'http'; import * as bodyparser from 'body-parser'; import * as winston from 'winston'; import * as expressWinston from 'express-winston'; import cors from 'cors'; import {CommonRoutesConfig} from './common/common.routes.config'; import {UsersRoutes} from './users/users.routes.config'; import debug from 'debug';
Μόνο δύο από αυτές τις εισαγωγές είναι νέες σε αυτό το σημείο στο άρθρο:
http
είναι μια λειτουργική μονάδα Node.js. Απαιτείται να ξεκινήσετε την εφαρμογή Express.js.body-parser
είναι το middleware που συνοδεύει το Express.js. Αναλύει το αίτημα (στην περίπτωσή μας, ως JSON) προτού ο έλεγχος μεταφερθεί στους δικούς μας διαχειριστές αιτημάτων.Τώρα που έχουμε εισαγάγει τα αρχεία, θα αρχίσουμε να δηλώνουμε τις μεταβλητές που θέλουμε να χρησιμοποιήσουμε:
const app: express.Application = express(); const server: http.Server = http.createServer(app); const port: Number = 3000; const routes: Array = []; const debugLog: debug.IDebugger = debug('app');
Το express()
Η συνάρτηση επιστρέφει το κύριο αντικείμενο εφαρμογής Express.js που θα περάσουμε σε ολόκληρο τον κώδικα, ξεκινώντας με την προσθήκη του στο http.Server
αντικείμενο. (Θα χρειαστεί να ξεκινήσουμε το http.Server
μετά τη διαμόρφωση του express.Application
.)
Θα ακούσουμε στη θύρα 3000 αντί για τις τυπικές θύρες 80 (HTTP) ή 443 (HTTPS), επειδή αυτές θα χρησιμοποιούνται συνήθως για τη διεπαφή μιας εφαρμογής.
Δεν υπάρχει κανόνας ότι η θύρα πρέπει να είναι 3000 — εάν δεν έχει καθοριστεί, αυθαίρετο λιμάνι θα εκχωρηθεί - αλλά το 3000 χρησιμοποιείται σε όλα τα παραδείγματα τεκμηρίωσης τόσο για το Node.js όσο και για το Express.js, επομένως συνεχίζουμε την παράδοση εδώ.
Μπορούμε ακόμα να εκτελούμε τοπικά σε μια προσαρμοσμένη θύρα, ακόμα και όταν θέλουμε το back end μας να ανταποκρίνεται σε αιτήματα σε τυπικές θύρες. Αυτό θα απαιτούσε ένα αντίστροφος διακομιστής μεσολάβησης για τη λήψη αιτημάτων στη θύρα 80 ή 443 με συγκεκριμένο τομέα ή υποτομέα. Στη συνέχεια θα τα ανακατευθύναμε στην εσωτερική μας θύρα 3000.
Το routes
Ο πίνακας θα παρακολουθεί τα αρχεία διαδρομών μας για σκοπούς εντοπισμού σφαλμάτων, όπως θα δούμε παρακάτω.
Τέλος, debugLog
θα καταλήξει ως συνάρτηση παρόμοια με το console.log
, αλλά καλύτερα: Είναι πιο εύκολο να τελειοποιήσετε, διότι αυτόματα καλύπτεται σε ό, τι θέλουμε να ονομάσουμε το περιβάλλον αρχείου / λειτουργικής μονάδας. (Σε αυτήν την περίπτωση, το ονομάσαμε «app» όταν το δώσαμε σε μια συμβολοσειρά στον κατασκευαστή debug()
.)
Τώρα, είμαστε έτοιμοι να διαμορφώσουμε όλες τις ενότητες middleware Express.js και τις διαδρομές του API μας:
// here we are adding middleware to parse all incoming requests as JSON app.use(bodyparser.json()); // here we are adding middleware to allow cross-origin requests app.use(cors()); // here we are configuring the expressWinston logging middleware, // which will automatically log all HTTP requests handled by Express.js app.use(expressWinston.logger({ transports: [ new winston.transports.Console() ], format: winston.format.combine( winston.format.colorize(), winston.format.json() ) })); // here we are adding the UserRoutes to our array, // after sending the Express.js application object to have the routes added to our app! routes.push(new UsersRoutes(app)); // here we are configuring the expressWinston error-logging middleware, // which doesn't *handle* errors per se, but does *log* them app.use(expressWinston.errorLogger({ transports: [ new winston.transports.Console() ], format: winston.format.combine( winston.format.colorize(), winston.format.json() ) })); // this is a simple route to make sure everything is working properly app.get('/', (req: express.Request, res: express.Response) => { res.status(200).send(`Server up and running!`) });
Ίσως έχετε παρατηρήσει ότι το expressWinston.errorLogger
έχει οριστεί μετά καθορίζουμε τις διαδρομές μας. Αυτό δεν είναι λάθος! Ως το τεκμηρίωση express-winston δηλώνει:
Το καταγραφικό πρέπει να προστεθεί ΜΕΤΑ τον γρήγορο δρομολογητή (
app.router
) και ΠΡΙΝ οποιονδήποτε από τους προσαρμοσμένους χειριστές σφαλμάτων (express.handler
).
Τέλος και το πιο σημαντικό:
πόσες σελίδες github μπορείτε να έχετε
server.listen(port, () => { debugLog(`Server running at http://localhost:${port}`); routes.forEach((route: CommonRoutesConfig) => { debugLog(`Routes configured for ${route.getName()}`); }); });
Αυτό ξεκινά πραγματικά τον διακομιστή μας. Μόλις ξεκινήσει, το Node.js θα εκτελέσει τη λειτουργία επανάκλησης, η οποία αναφέρει ότι εκτελούμε, ακολουθούμενη από τα ονόματα όλων των διαδρομών που έχουμε διαμορφώσει - μέχρι τώρα, απλώς UsersRoutes
.
package.json
να μεταφέρετε TypeScript σε JavaScript και να εκτελέσετε την εφαρμογήΤώρα που έχουμε τον σκελετό μας έτοιμο να τρέξει, χρειαζόμαστε πρώτα κάποια διαμόρφωση boilerplate για να επιτρέψουμε τη μεταφορά TypeScript. Ας προσθέσουμε το αρχείο tsconfig.json
στη ρίζα του έργου:
{ 'compilerOptions': { 'target': 'es2016', 'module': 'commonjs', 'outDir': './dist', 'strict': true, 'esModuleInterop': true, 'inlineSourceMap': true } }
Τότε πρέπει απλώς να προσθέσουμε τις τελευταίες πινελιές στο package.json
με τη μορφή των παρακάτω σεναρίων:
'scripts': { 'start': 'tsc && node ./dist/app.js', 'debug': 'export DEBUG=* && npm run start', 'test': 'echo 'Error: no test specified' && exit 1' },
Το test
Το σενάριο είναι ένα σύμβολο κράτησης θέσης που θα αντικαταστήσουμε αργότερα στη σειρά.
ο tsc στο start
Το σενάριο ανήκει στο TypeScript. Είναι υπεύθυνο για τη μεταφορά του κώδικα TypeScript σε JavaScript, τον οποίο θα εξάγει στο dist
ντοσιέ. Στη συνέχεια, τρέχουμε την ενσωματωμένη έκδοση με node ./dist/app.js
.
Το debug
Το σενάριο καλεί το start
σενάριο αλλά πρώτα ορίζει ένα DEBUG
μεταβλητή περιβάλλοντος. Αυτό έχει ως αποτέλεσμα την ενεργοποίηση όλων των debugLog()
μας δηλώσεις (καθώς και παρόμοιες από το ίδιο το Express.js, το οποίο χρησιμοποιεί την ίδια debug
ενότητα που κάνουμε) για την έξοδο χρήσιμων λεπτομερειών στο τερματικό - λεπτομέρειες που (βολικά) αποκρύπτονται διαφορετικά κατά την εκτέλεση του διακομιστή σε λειτουργία παραγωγής με ένα πρότυπο npm start
.
Δοκιμάστε να εκτελέσετε npm run debug
τον εαυτό σας και, στη συνέχεια, το συγκρίνετε με το npm start
για να δείτε πώς αλλάζει η έξοδος της κονσόλας.
Συμβουλή: Μπορείτε να περιορίσετε την έξοδο εντοπισμού σφαλμάτων στο app.ts
δικό του αρχείου debugLog()
δηλώσεις χρησιμοποιώντας DEBUG=app
αντί για DEBUG=*
. Το debug
η ενότητα είναι γενικά αρκετά ευέλικτη, και αυτή η δυνατότητα δεν αποτελεί εξαίρεση .
Οι χρήστες των Windows πιθανότατα θα πρέπει να αλλάξουν το export
έως SET
από export
είναι πώς λειτουργεί σε Mac και Linux. Εάν το έργο σας πρέπει να υποστηρίζει πολλαπλά περιβάλλοντα ανάπτυξης, το πακέτο cross-env παρέχει μια απλή λύση εδώ.
Με npm run debug
ή npm start
συνεχίζει, το REST API μας θα είναι έτοιμο να εξυπηρετήσει αιτήματα στη θύρα 3000. Σε αυτό το σημείο, μπορούμε να χρησιμοποιήσουμε το cURL, Ταχυδρόμος , Αυπνία κ.λπ. για να δοκιμάσετε το πίσω άκρο.
Εφόσον δημιουργήσαμε μόνο ένα σκελετό για τον πόρο των χρηστών, μπορούμε απλώς να στείλουμε αιτήματα χωρίς σώμα για να δούμε ότι όλα λειτουργούν όπως αναμενόταν. Για παράδειγμα:
curl --location --request GET 'localhost:3000/users/12345'
Το πίσω μέρος μας πρέπει να στείλει πίσω την απάντηση GET requested for id 12345
.
Όσον αφορά POST
ing:
curl --location --request POST 'localhost:3000/users' --data-raw ''
Αυτό και όλοι οι άλλοι τύποι αιτημάτων για τους οποίους δημιουργήσαμε σκελετούς θα μοιάζουν αρκετά.
Σε αυτό το άρθρο, ξεκινήσαμε να δημιουργούμε ένα REST API ρυθμίζοντας το έργο από το μηδέν και καταδύοντας τα βασικά στοιχεία του πλαισίου Express.js. Στη συνέχεια, κάναμε το πρώτο μας βήμα προς τον έλεγχο του TypeScript δημιουργώντας ένα μοτίβο με UsersRoutesConfig
επέκταση CommonRoutesConfig
, ένα μοτίβο που θα επαναχρησιμοποιήσουμε για το επόμενο άρθρο αυτής της σειράς. Τελειώσαμε διαμορφώνοντας το app.ts
σημείο εισόδου για να χρησιμοποιήσετε τις νέες μας διαδρομές και package.json
με σενάρια για την κατασκευή και εκτέλεση της εφαρμογής μας.
Αλλά ακόμη και τα βασικά ενός API REST που έχει δημιουργηθεί με Express.js και TypeScript είναι αρκετά εμπλεκόμενα. Σε το επόμενο μέρος αυτής της σειράς, εστιάζουμε στη δημιουργία κατάλληλων ελεγκτών για τον πόρο των χρηστών και ανακαλύπτουμε μερικά χρήσιμα μοτίβα για υπηρεσίες, μεσαίο λογισμικό, ελεγκτές και μοντέλα.
Το πλήρες έργο είναι διαθέσιμο στο GitHub , και ο κωδικός από το τέλος αυτού του άρθρου βρίσκεται στο toptal-article-01
κλαδί.
τι είναι η ελληνική κρίση χρέους
Απολύτως! Είναι πολύ κοινό για τα δημοφιλή πακέτα npm (συμπεριλαμβανομένου του Express.js) να έχουν αντίστοιχα αρχεία ορισμού τύπου TypeScript. Αυτό ισχύει για το ίδιο το Node.js, καθώς και υπο-στοιχεία όπως το πακέτο εντοπισμού σφαλμάτων.
Ναί. Το Node.js μπορεί να χρησιμοποιηθεί από μόνο του για να δημιουργήσει REST API έτοιμα για παραγωγή και υπάρχουν επίσης πολλά δημοφιλή πλαίσια όπως το Express.js για τη μείωση του αναπόφευκτου boilerplate.
Όχι, δεν είναι δύσκολο να αρχίσετε να μαθαίνετε TypeScript για όσους έχουν σύγχρονο φόντο JavaScript. Είναι ακόμη πιο εύκολο για όσους έχουν εμπειρία στον αντικειμενοστρεφή προγραμματισμό. Όμως, η απόκτηση όλων των αποχρώσεων και των βέλτιστων πρακτικών του TypeScript απαιτεί χρόνο, όπως με κάθε δεξιότητα.
Εξαρτάται από το έργο, αλλά συνιστάται σίγουρα για τον προγραμματισμό του Node.js. Είναι μια πιο εκφραστική γλώσσα για τη μοντελοποίηση πραγματικών τομέων με προβλήματα στο πίσω μέρος. Αυτό καθιστά τον κώδικα πιο ευανάγνωστο και μειώνει τις πιθανότητες για σφάλματα.
Το TypeScript χρησιμοποιείται οπουδήποτε βρίσκεται το JavaScript, αλλά είναι ιδιαίτερα κατάλληλο για μεγαλύτερες εφαρμογές. Χρησιμοποιεί JavaScript ως βάση, προσθέτοντας στατική πληκτρολόγηση και πολύ καλύτερη υποστήριξη για το πρότυπο αντικειμενοστραφής προγραμματισμού (OOP). Αυτό, με τη σειρά του, υποστηρίζει μια πιο προηγμένη εμπειρία ανάπτυξης και εντοπισμού σφαλμάτων.