portaldacalheta.pt
  • Κύριος
  • Επιστήμη Δεδομένων Και Βάσεις Δεδομένων
  • Κατανεμημένες Ομάδες
  • Ευκίνητο Ταλέντο
  • Κερδοφορία & Αποδοτικότητα
Πίσω Μέρος

Δημιουργία ενός Node.js / TypeScript REST API, Μέρος 1: Express.js



Πώς μπορώ να γράψω ένα REST API στο Node.js;

Όταν δημιουργείτε ένα back-end για ένα REST API, το Express.js είναι συχνά η πρώτη επιλογή μεταξύ των πλαισίων Node.js. Ενώ υποστηρίζει επίσης τη δημιουργία στατικού HTML και προτύπων, σε αυτήν τη σειρά, θα επικεντρωθούμε στην ανάπτυξη back-end χρησιμοποιώντας TypeScript. Το προκύπτον REST API θα είναι εκείνο που θα μπορούσε να υποβάλει ερώτημα για οποιοδήποτε πλαίσιο front-end ή εξωτερική υπηρεσία back-end.

Θα χρειαστείς:



κατάσταση ταμειακών ροών από τον ισολογισμό
  • Βασικές γνώσεις JavaScript και TypeScript
  • Βασικές γνώσεις του Node.js
  • Βασικές γνώσεις της αρχιτεκτονικής REST (πρβλ. αυτός ο τομέας του προηγούμενου άρθρου μου REST API, εάν χρειάζεται)
  • Μια έτοιμη εγκατάσταση του Node.js (κατά προτίμηση έκδοση 14+)

Σε ένα τερματικό (ή μια γραμμή εντολών), θα δημιουργήσουμε έναν φάκελο για το έργο. Από αυτόν το φάκελο, εκτελέστε 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' }

Τώρα που έχουμε εγκαταστήσει όλες τις απαιτούμενες εξαρτήσεις μας, ας αρχίσουμε να δημιουργούμε τον δικό μας κώδικα!

Δομή έργου TypeScript REST API

Για αυτό το σεμινάριο, πρόκειται να δημιουργήσουμε μόνο τρία αρχεία:



  1. ./app.ts
  2. ./common/common.routes.config.ts
  3. ./users/users.routes.config.ts

Η ιδέα πίσω από τους δύο φακέλους της δομής του έργου (common και users) είναι να υπάρχουν μεμονωμένες ενότητες που έχουν τις δικές τους ευθύνες. Υπό αυτήν την έννοια, θα έχουμε τελικά κάποια ή όλα τα ακόλουθα για κάθε ενότητα:

  • Διαμόρφωση διαδρομής για να καθορίσουμε τα αιτήματα που μπορεί να χειριστεί το API μας
  • Υπηρεσίες για εργασίες όπως η σύνδεση με τα μοντέλα της βάσης δεδομένων μας, η πραγματοποίηση ερωτημάτων ή η σύνδεση με εξωτερικές υπηρεσίες που απαιτούνται από το συγκεκριμένο αίτημα
  • Middleware για εκτέλεση επικυρώσεων συγκεκριμένων αιτημάτων πριν ο τελικός ελεγκτής μιας διαδρομής χειριστεί τις ιδιαιτερότητές του
  • Μοντέλα για τον καθορισμό μοντέλων δεδομένων που ταιριάζουν σε ένα δεδομένο σχήμα βάσης δεδομένων, για τη διευκόλυνση της αποθήκευσης και της ανάκτησης δεδομένων
  • Ελεγκτές για το διαχωρισμό της διαμόρφωσης της διαδρομής από τον κώδικα που τελικά (μετά από οποιοδήποτε ενδιάμεσο λογισμικό) επεξεργάζεται ένα αίτημα διαδρομής, καλεί τις παραπάνω λειτουργίες υπηρεσίας εάν είναι απαραίτητο και δίνει απάντηση στον πελάτη

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



Ένα κοινό αρχείο διαδρομών σε TypeScript

Στο 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 θα έχει πρόσβαση σε αυτό.

Χρήση TypeScript Abstract Functions για παρόμοια λειτουργικότητα σε όλες τις τάξεις

Τι γίνεται αν θέλουμε να έχουμε κάποια λειτουργικότητα παρόμοιος μεταξύ αυτών των τάξεων (όπως η διαμόρφωση των τελικών σημείων API), αλλά αυτό χρειάζεται διαφορετική εφαρμογή για κάθε τάξη; Μια επιλογή είναι να χρησιμοποιήσετε μια λειτουργία TypeScript που ονομάζεται αφαίρεση .

Ας δημιουργήσουμε μια πολύ απλή αφηρημένη συνάρτηση που η UsersRoutes Η κλάση (και οι μελλοντικές κλάσεις δρομολόγησης) θα κληρονομηθούν από CommonRoutesConfig. Ας πούμε ότι θέλουμε να αναγκάσουμε όλες τις διαδρομές να έχουν μια λειτουργία (έτσι μπορούμε να την καλέσουμε από τον κοινό κατασκευαστή μας) με το όνομα configureRoutes(). Εκεί θα δηλώσουμε τα τελικά σημεία του πόρου κάθε κλάσης δρομολόγησης.

Για να γίνει αυτό, θα προσθέσουμε τρία γρήγορα πράγματα στο common.routes.config.ts:

  1. Η λέξη-κλειδί abstract στο class μας γραμμή, για να ενεργοποιηθεί η αφαίρεση για αυτήν την τάξη.
  2. Μια νέα δήλωση λειτουργίας στο τέλος της τάξης μας, abstract configureRoutes(): express.Application;. Αυτό αναγκάζει οποιαδήποτε κλάση να επεκτείνεται CommonRoutesConfig για να παρέχει μια εφαρμογή που να ταιριάζει με αυτήν την υπογραφή - αν δεν το κάνει, ο μεταγλωττιστής TypeScript θα εμφανίσει ένα σφάλμα.
  3. Κλήση προς 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().)

Διαμόρφωση των διαδρομών Express.js των τελικών σημείων των χρηστών

Το configureRoutes() Η λειτουργία είναι όπου θα δημιουργήσουμε τα τελικά σημεία για τους χρήστες του REST API μας. Εκεί, θα χρησιμοποιήσουμε το εφαρμογή και είναι Διαδρομή λειτουργίες από το Express.js.

Η ιδέα της χρήσης του app.route() Η λειτουργία είναι να αποφευχθεί η επικάλυψη κώδικα, κάτι που είναι εύκολο αφού δημιουργούμε ένα REST API με καλά καθορισμένους πόρους. Ο κύριος πόρος για αυτό το σεμινάριο είναι χρήστες . Έχουμε δύο περιπτώσεις σε αυτό το σενάριο:

  • Όταν ο καλούντος 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.

  • ο Αίτηση είναι ο τρόπος με τον οποίο το Express.js αντιπροσωπεύει το αίτημα HTTP που πρέπει να αντιμετωπιστεί. Αυτός ο τύπος αναβαθμίζει και επεκτείνει το εγγενές Node.js τύπος αιτήματος.
  • ο Απάντηση είναι επίσης ο τρόπος με τον οποίο το Express.js αντιπροσωπεύει την απόκριση HTTP, επεκτείνοντας και πάλι το εγγενές Node.js τύπος απόκρισης.
  • Όχι λιγότερο σημαντικό, το NextFunction χρησιμεύει ως λειτουργία επιστροφής κλήσης, επιτρέποντας στον έλεγχο να διέρχεται από άλλες λειτουργίες του μεσαίου λογισμικού. Στην πορεία, όλα τα μεσαία προγράμματα θα μοιράζονται τα ίδια αντικείμενα αιτήματος και απόκρισης προτού ο ελεγκτής στείλει τελικά μια απάντηση στον αιτούντα.

Το αρχείο σημείου εισόδου Node.js, 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), επειδή αυτές θα χρησιμοποιούνται συνήθως για τη διεπαφή μιας εφαρμογής.

Γιατί το Port 3000;

Δεν υπάρχει κανόνας ότι η θύρα πρέπει να είναι 3000 — εάν δεν έχει καθοριστεί, αυθαίρετο λιμάνι θα εκχωρηθεί - αλλά το 3000 χρησιμοποιείται σε όλα τα παραδείγματα τεκμηρίωσης τόσο για το Node.js όσο και για το Express.js, επομένως συνεχίζουμε την παράδοση εδώ.

Μπορεί το Node.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 παρέχει μια απλή λύση εδώ.

Δοκιμή του Back End του Live Express.js

Με 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 ''

Αυτό και όλοι οι άλλοι τύποι αιτημάτων για τους οποίους δημιουργήσαμε σκελετούς θα μοιάζουν αρκετά.

Προετοιμασία για γρήγορη ανάπτυξη API REST Node.js με TypeScript

Σε αυτό το άρθρο, ξεκινήσαμε να δημιουργούμε ένα REST API ρυθμίζοντας το έργο από το μηδέν και καταδύοντας τα βασικά στοιχεία του πλαισίου Express.js. Στη συνέχεια, κάναμε το πρώτο μας βήμα προς τον έλεγχο του TypeScript δημιουργώντας ένα μοτίβο με UsersRoutesConfig επέκταση CommonRoutesConfig, ένα μοτίβο που θα επαναχρησιμοποιήσουμε για το επόμενο άρθρο αυτής της σειράς. Τελειώσαμε διαμορφώνοντας το app.ts σημείο εισόδου για να χρησιμοποιήσετε τις νέες μας διαδρομές και package.json με σενάρια για την κατασκευή και εκτέλεση της εφαρμογής μας.

Αλλά ακόμη και τα βασικά ενός API REST που έχει δημιουργηθεί με Express.js και TypeScript είναι αρκετά εμπλεκόμενα. Σε το επόμενο μέρος αυτής της σειράς, εστιάζουμε στη δημιουργία κατάλληλων ελεγκτών για τον πόρο των χρηστών και ανακαλύπτουμε μερικά χρήσιμα μοτίβα για υπηρεσίες, μεσαίο λογισμικό, ελεγκτές και μοντέλα.

Το πλήρες έργο είναι διαθέσιμο στο GitHub , και ο κωδικός από το τέλος αυτού του άρθρου βρίσκεται στο toptal-article-01 κλαδί.

τι είναι η ελληνική κρίση χρέους

Κατανόηση των βασικών

Μπορώ να χρησιμοποιήσω το TypeScript με το Node.js;

Απολύτως! Είναι πολύ κοινό για τα δημοφιλή πακέτα npm (συμπεριλαμβανομένου του Express.js) να έχουν αντίστοιχα αρχεία ορισμού τύπου TypeScript. Αυτό ισχύει για το ίδιο το Node.js, καθώς και υπο-στοιχεία όπως το πακέτο εντοπισμού σφαλμάτων.

Είναι το Node.js καλό για REST APIs;

Ναί. Το Node.js μπορεί να χρησιμοποιηθεί από μόνο του για να δημιουργήσει REST API έτοιμα για παραγωγή και υπάρχουν επίσης πολλά δημοφιλή πλαίσια όπως το Express.js για τη μείωση του αναπόφευκτου boilerplate.

Είναι δύσκολο να μάθει κανείς το TypeScript;

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

Πρέπει να χρησιμοποιήσω το TypeScript;

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

Σε τι χρησιμοποιείται το TypeScript;

Το TypeScript χρησιμοποιείται οπουδήποτε βρίσκεται το JavaScript, αλλά είναι ιδιαίτερα κατάλληλο για μεγαλύτερες εφαρμογές. Χρησιμοποιεί JavaScript ως βάση, προσθέτοντας στατική πληκτρολόγηση και πολύ καλύτερη υποστήριξη για το πρότυπο αντικειμενοστραφής προγραμματισμού (OOP). Αυτό, με τη σειρά του, υποστηρίζει μια πιο προηγμένη εμπειρία ανάπτυξης και εντοπισμού σφαλμάτων.

Δημιουργία Πραγματικά Αρθρωτού Κώδικα χωρίς Εξαρτήσεις

Διαχείριση Έργου

Δημιουργία Πραγματικά Αρθρωτού Κώδικα χωρίς Εξαρτήσεις
Πώς να αποκτήσετε συμβουλευτικούς πελάτες - Συνέντευξη με τον Steve Blank

Πώς να αποκτήσετε συμβουλευτικούς πελάτες - Συνέντευξη με τον Steve Blank

Διαδικασίες Χρηματοδότησης

Δημοφιλείς Αναρτήσεις
Πώς να επιλέξετε το καλύτερο πλαίσιο Front-End
Πώς να επιλέξετε το καλύτερο πλαίσιο Front-End
Χρειάζεστε έναν ήρωα: Ο υπεύθυνος έργου
Χρειάζεστε έναν ήρωα: Ο υπεύθυνος έργου
Πώς να βελτιώσετε την απόδοση της εφαρμογής ASP.NET στο Web Farm με προσωρινή αποθήκευση
Πώς να βελτιώσετε την απόδοση της εφαρμογής ASP.NET στο Web Farm με προσωρινή αποθήκευση
Οι δοκιμασμένοι και αληθινοί νόμοι του UX (με Infographic)
Οι δοκιμασμένοι και αληθινοί νόμοι του UX (με Infographic)
Ανώτερος συνεργάτης πελάτη, υγειονομική περίθαλψη και βιοεπιστήμες
Ανώτερος συνεργάτης πελάτη, υγειονομική περίθαλψη και βιοεπιστήμες
 
Η άνοδος των αυτοματοποιημένων συναλλαγών: Μηχανές που εμπορεύονται το S&P 500
Η άνοδος των αυτοματοποιημένων συναλλαγών: Μηχανές που εμπορεύονται το S&P 500
10 πιο κοινές ευπάθειες ασφαλείας στον Ιστό
10 πιο κοινές ευπάθειες ασφαλείας στον Ιστό
Σκέψεις για τη συγκέντρωση του ιδιωτικού σας αμοιβαίου κεφαλαίου
Σκέψεις για τη συγκέντρωση του ιδιωτικού σας αμοιβαίου κεφαλαίου
Διευθυντής έργου και διαχείρισης προϊόντων
Διευθυντής έργου και διαχείρισης προϊόντων
Η σημασία της διατήρησης πελατών - μια εμπειρική μελέτη
Η σημασία της διατήρησης πελατών - μια εμπειρική μελέτη
Δημοφιλείς Αναρτήσεις
  • πρότυπο φύλλου m&a
  • πώς χρεώθηκε η Ελλάδα
  • ποια είναι τα στοιχεία και οι αρχές του σχεδιασμού
  • οθόνη πολυμέσων και ελάχιστο πλάτος
  • χειρισμός σφαλμάτων στον κόμβο js
Κατηγορίες
  • Επιστήμη Δεδομένων Και Βάσεις Δεδομένων
  • Κατανεμημένες Ομάδες
  • Ευκίνητο Ταλέντο
  • Κερδοφορία & Αποδοτικότητα
  • © 2022 | Ολα Τα Δικαιώματα Διατηρούνται

    portaldacalheta.pt