Δημιουργήστε το δικό σας API χρησιμοποιώντας αυτές τις δημοφιλείς τεχνολογίες ιστού.

Το GraphQL και το NestJS συνάπτουν μια εξαιρετική συνεργασία, δίνοντάς σας μια σταθερή βάση για τα API σας και ένα εύχρηστο πλαίσιο για τη δημιουργία επεκτάσιμων εφαρμογών ιστού. Ο συνδυασμός είναι τέλειος για τη δημιουργία εφαρμογών έτοιμων για παραγωγή και τα δύο είναι πολύ σχετικά εργαλεία στο σημερινό τεχνολογικό οικοσύστημα.

Μάθετε περισσότερα για το πώς μπορείτε να δημιουργήσετε ένα API χρησιμοποιώντας και τα δύο προϊόντα.

Τι είναι το GraphQL;

Η GraphQL είναι μια γλώσσα ερωτημάτων και χειρισμού δεδομένων μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε API με πιο ακριβή και συνοπτικό τρόπο. Το GraphQL παρέχει μια πλήρη και επαρκή περιγραφή των δεδομένων που υπάρχουν σε ένα API και δίνει τη δυνατότητα στον πελάτη να λάβει τα ακριβή δεδομένα που χρειάζονται.

Το GraphQL παρέχει πολλές δυνατότητες που στερούνται τα REST API, που κυμαίνονται από ακριβή ερωτήματα δεδομένων έως καλύτερα εργαλεία προγραμματιστών, όπως

instagram viewer
graphiql συντάκτης. Σας επιτρέπει επίσης να κάνετε αναζήτηση για πολλούς πόρους μέσω ενός μόνο αιτήματος.

Τι είναι το NestJS;

Το NestJS είναι ένα προοδευτικό πλαίσιο Node.js που μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε επεκτάσιμες και αποτελεσματικές εφαρμογές από την πλευρά του διακομιστή. Το NestJS παρέχει πολλές προσθήκες, μαζί με εργαλεία για γρήγορη και εύκολη ανάπτυξη, όπως υποστήριξη GraphQL, GRPC, WebSockets κ.λπ.

Το NestJS είναι γνωστό στο οικοσύστημα για τη βελτιστοποιημένη δομή του έργου του που χρησιμοποιεί ενότητες, ελεγκτές, υπηρεσίες και σχήματα. Το ενσωματωμένο CLI σας επιτρέπει να δημιουργήσετε μια δομημένη αρχιτεκτονική API. Μπορείς να χρησιμοποιήσεις αρχές ένεσης εξάρτησης για τον έλεγχο του τρόπου με τον οποίο τα μέρη μιας εφαρμογής επικοινωνούν μεταξύ τους.

Εφαρμογή GraphQL με NestJS και MongoDB

Προτού δημιουργήσετε ένα API με NestJS και GraphQL, θα πρέπει να έχετε τις κατάλληλες εξαρτήσεις διαθέσιμες. Χρειάζεσαι για να εγκαταστήσετε το Node.js και NestJS, το οποίο μπορείτε να εγκαταστήσετε εκτελώντας npm i -g @nestjs/cli.

Το παράδειγμα που ακολουθεί είναι μια απλή εφαρμογή που αποθηκεύει πληροφορίες για βιβλία. Εκτελέστε την ακόλουθη εντολή στο τερματικό σας για να δημιουργήσετε μια νέα εφαρμογή NestJS:

φωλιά καινούργια 

Πλοηγηθείτε στον κατάλογο της εφαρμογής που δημιουργήθηκε () και εγκαταστήστε τις εξαρτήσεις του με την ακόλουθη εντολή:

$ npm install --save @nestjs/config @nestjs/graphql graphql-tools graphql \
 @nestjs/apollo apollo-server-express @nestjs/mongoose @types/graphql

Υπάρχουν δύο κύριες προσεγγίσεις για τη δημιουργία GraphQL API, και συγκεκριμένα:

  1. Πρώτη προσέγγιση σχήματος: όπου περιγράφετε το API σε αρχεία ορισμού σχήματος ή SDL και το NestJS δημιουργεί ορισμούς Typescript βάσει αυτών.
  2. Πρώτη προσέγγιση κώδικα: όπου ορίζετε ερωτήματα, μεταλλάξεις και άλλες λειτουργίες του GraphQL χρησιμοποιώντας κλάσεις Typescript και διακοσμητές και το NestJS δημιουργεί αρχεία SDL με βάση αυτά.

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

Πρώτα, πρέπει να αρχικοποιήσετε το GraphQL στο δικό σας AppModule και συνδέστε το σε μια βάση δεδομένων MongoDB:

// app.module.ts
εισαγωγή { Ενότητα } από'@nestjs/common';
εισαγωγή { GraphQLModule όπως και NestGraphQLModule } από'@nestjs/graphql';
εισαγωγή { ApolloDriver, ApolloDriverConfig } από'@nestjs/apollo';
εισαγωγή { Συμμετοχή } από'μονοπάτι';
εισαγωγή { MongooseModule } από'@nestjs/mongoose';
εισαγωγή { AppController } από"./app.controller";
εισαγωγή { AppService } από"./app.service";
εισαγωγή { ConfigModule, ConfigService } από'@nestjs/config';
εισαγωγή mongodbConfig από'./config/mongodb.config';

@Μονάδα μέτρησης({
εισαγωγές: [
ConfigModule.forRoot({
φόρτωση: [mongodbConfig],
isGlobal: αληθής
}),
NestGraphQLModule.forRootAsync({
οδηγός: ApolloDriver,
inject: [ConfigService],
useFactory: ασυγχρονισμός (configService: ConfigService) => ({
autoSchemaFile: join (process.cwd(), 'src/schema.gql'),
installSubscriptionHandlers: αληθής,
sortSchema: αληθής,
παιδική χαρά: αληθής,
εντοπισμός σφαλμάτων: configService.get<boolean>("DEBUG"),
μεταφορτώσεις: ψευδής,
}),
}),
MongooseModule.forRootAsync({
inject: [ConfigService],
useFactory: ασυγχρονισμός (configService: ConfigService) => ({
uri: configService.get('MONGO_URI')
})
}),
],
ελεγκτές: [AppController],
πάροχοι: [AppService],
})

εξαγωγήτάξη AppModule {}

Αυτή η ενότητα εισάγει το GraphQLModule από @nestjs/graphql και το MongooseModule από @nestjs/mongoose που βοηθά στη σύνδεση στο MongoDB. ο autoSchemaFile Η ιδιότητα καθορίζει τη θέση του αρχείου σχήματος που δημιουργείται και το sortSchema Η ιδιοκτησία διασφαλίζει ότι ταξινομεί τα πεδία αλφαβητικά.

Δείτε ποιο είναι το MongoDB σας config το αρχείο θα πρέπει να μοιάζει με:

εισαγωγή { registerAs } από'@nestjs/config';

/**
 * Διαμόρφωση σύνδεσης βάσης δεδομένων Mongo
 */
εξαγωγήΠροκαθορισμένο registerAs('mongodb', () => {
συνθ {
MONGO_URI
} = process.env;

ΕΠΙΣΤΡΟΦΗ {
uri: `${MONGO_URI}`,
};
});

Καθορισμός του σχήματος GraphQL

Έχοντας ρυθμίσει τις συνδέσεις GraphQL και MongoDB, θα πρέπει να ορίσετε ερωτήματα και μεταλλάξεις GraphQL για να δημιουργήσετε ένα σχήμα (schema.gql) αρχείο.

Σύνταξη ερωτημάτων

Στο προσέγγιση πρώτου κώδικα, δημιουργείτε ένα μοντέλο χρησιμοποιώντας το Τύπος αντικειμένου διακοσμητής. Αργότερα θα μετατρέψετε αυτό το μοντέλο σε τύπο GraphQL.

Για παράδειγμα:

// book.model.ts
εισαγωγή { Πεδίο, Τύπος αντικειμένου } από'@nestjs/graphql';
εισαγωγή { Prop, Schema, SchemaFactory } από'@nestjs/mongoose';
εισαγωγή { Document } από'μαγκούστα';

εξαγωγήτύπος BookDocument = Βιβλίο & Έγγραφο;

@ObjectType()
@Σχήμα()
εξαγωγήτάξη Βιβλίο {
@Πεδίο()
τίτλος: σειρά;

@Πεδίο()
συγγραφέας: σειρά;

@Πεδίο()
Ημερομηνία δημοσίευσης: boolean;
}

εξαγωγήσυνθ BookSchema = SchemaFactory.createForClass (Βιβλίο);

Το GraphQL, από προεπιλογή, δεν μπορεί να χρησιμοποιήσει τα δημιουργημένα σχήματα. Για να τα κάνετε λειτουργικά, χρειάζεστε μια υπηρεσία επίλυσης που περιέχει τις συναρτήσεις για την εκτέλεση των τύπων GraphQL. Μπορείτε να το κάνετε με το Διαλύων διακοσμητής.

// books.resolver.ts
εισαγωγή { Resolver, Query, Mutation, Args, ID } από'@nestjs/graphql';
εισαγωγή { Βιβλίο } από"./book.model";
εισαγωγή { BookService } από"./books.service";

@Διαλύων(() => Βιβλίο)
εξαγωγήτάξη BookResolver {
κατασκευαστής(ιδιωτικός bookService μόνο για ανάγνωση: BookService) { }

@Ερώτηση(() => [Βιβλίο])
ασυγχρονισμός βιβλία (): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookService.findAll();
}

@Ερώτηση(() => Βιβλίο)
ασυγχρονισμός Βιβλίο(@Args('ταυτότητα', { τύπος: () => ID }) id: σειρά): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookService.findOne (id);
}
}

Μπορείτε να εφαρμόσετε το BookService, που εισάγεται παραπάνω, ως εξής:

// books.service.ts
εισαγωγή { Ενέσιμο } από'@nestjs/common';
εισαγωγή { InjectModel } από'@nestjs/mongoose';
εισαγωγή { Μοντέλο } από'μαγκούστα';
εισαγωγή { Book, BookDocument } από"./book.model";

@Ενέσιμα()
εξαγωγήτάξη BookService {
κατασκευαστής(@InjectModel(Book.name) ιδιωτικός βιβλίοΜοντέλο: Μοντέλο) { }

ασυγχρονισμός findAll(): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookModel.find().exec();
}

ασυγχρονισμός findOne (αναγνωριστικό: σειρά): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookModel.findById (id).exec();
}
}

Πρέπει επίσης να προσθέσετε το BookResolver στη λίστα των παρόχων βιβλία.ενότητα.τσ.

εισαγωγή { Ενότητα } από"@nestjs/common";
εισαγωγή { MongooseModule } από"@nestjs/mongoose";
εισαγωγή { BookService } από"./books.service";
εισαγωγή { BookResolver } από"./books.resolver";
εισαγωγή { Book, BookSchema } από"./book.model";

@Μονάδα μέτρησης({
πάροχοι: [
BookService,
BookResolver
],
εισαγωγές: [MongooseModule.forFeature([
{
όνομα: Book.name,
schema: BookSchema,
},
]),
],
})

εξαγωγήτάξη BooksModule {}

Εργασία με μεταλλάξεις

Ενώ χρησιμοποιείτε ένα ερώτημα για την ανάκτηση δεδομένων στο GraphQL, οι μεταλλάξεις δημιουργούν ή ενημερώνουν δεδομένα στη βάση δεδομένων. Για να δημιουργήσετε μεταλλάξεις, πρέπει να αποδεχτείτε δεδομένα από χρήστες. ο Τύπος εισόδου Ο διακοσμητής, ο οποίος μετατρέπει μια τάξη σε τύπο εισόδου GraphQL, είναι χρήσιμος εδώ.

// book.input.ts
εισαγωγή { InputType, Field } από'@nestjs/graphql';

@InputType()
εξαγωγήτάξη Εισαγωγή βιβλίου {
@Πεδίο()
τίτλος: σειρά;

@Πεδίο()
συγγραφέας: σειρά;

@Πεδίο()
Ημερομηνία δημοσίευσης: boolean
}

Μπορείτε τώρα να ενημερώσετε βιβλία.resolver.ts να μοιάζει με αυτό:

εισαγωγή { Resolver, Query, Mutation, Args, ID } από'@nestjs/graphql';
εισαγωγή { Βιβλίο } από"./book.model";
εισαγωγή { BookService } από"./books.service";
εισαγωγή { BookInput } από"./book.input";

@Διαλύων(() => Βιβλίο)
εξαγωγήτάξη BookResolver {
κατασκευαστής(ιδιωτικός bookService μόνο για ανάγνωση: BookService) { }

@Μετάλλαξη(() => Βιβλίο)
ασυγχρονισμός Δημιουργία Βιβλίου (@Args('εισαγωγή') είσοδος: BookInput): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookService.create (εισαγωγή);
}

@Μετάλλαξη(() => Βιβλίο)
ασυγχρονισμός updateBook(
@Args('ταυτότητα', { τύπος: () => ID }) id: σειρά,
@Args('εισαγωγή') είσοδος: BookInput,
): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookService.update (αναγνωριστικό, είσοδος);
}

@Μετάλλαξη(() => Βιβλίο)
ασυγχρονισμός διαγραφή βιβλίου(@Args('ταυτότητα', { τύπος: () => ID }) id: σειρά): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookService.delete (id);
}
}

Και βιβλία.υπηρεσία.τσ σαν αυτό:

εισαγωγή { Ενέσιμο } από'@nestjs/common';
εισαγωγή { InjectModel } από'@nestjs/mongoose';
εισαγωγή { Μοντέλο } από'μαγκούστα';
εισαγωγή { Book, BookDocument } από"./book.model";

@Ενέσιμα()
εξαγωγήτάξη BookService {
κατασκευαστής(@InjectModel(Book.name) ιδιωτικός βιβλίοΜοντέλο: Μοντέλο) { }

ασυγχρονισμός δημιουργία (βιβλίο: Βιβλίο): Υπόσχεση {
συνθ νέο βιβλίο = νέοςΑυτό.bookModel (βιβλίο);
ΕΠΙΣΤΡΟΦΗ newBook.save();
}

ασυγχρονισμός ενημέρωση (id: σειρά, βιβλίο: Βιβλίο): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookModel.findByIdAndUpdate (αναγνωριστικό, βιβλίο, { νέος: αληθής }).exec();
}

ασυγχρονισμόςδιαγράφω(ταυτότητα: σειρά): Υπόσχεση {
ΕΠΙΣΤΡΟΦΗΑυτό.bookModel.findByIdAndDelete (id).exec();
}
}

ο @Μετάλλαξη διακοσμητής σηματοδοτεί μια λειτουργία ως τύπο μετάλλαξης και το @Args διακοσμητής αρπάζει τυχόν εισόδους που έχουν περάσει στη λειτουργία.

Τέλος, θα πρέπει να εισαγάγετε το BooksModule σε AppModule για να το κάνει λειτουργικό. Θα πρέπει επίσης να περάσετε το BooksModule προς την forRootAsync όπως φαίνεται παρακάτω.

εισαγωγή { BooksModule } από"./books/books.module";
/**
 * άλλες εισαγωγές
*/

@Μονάδα μέτρησης({
εισαγωγές: [
ConfigModule.forRoot({
φόρτωση: [mongodbConfig],
isGlobal: αληθής
}),
NestGraphQLModule.forRootAsync({
οδηγός: ApolloDriver,
inject: [ConfigService],
useFactory: ασυγχρονισμός (configService: ConfigService) => ({
autoSchemaFile: join (process.cwd(), 'src/schema.gql'),
installSubscriptionHandlers: αληθής,
sortSchema: αληθής,
παιδική χαρά: αληθής,
εντοπισμός σφαλμάτων: configService.get<boolean>("DEBUG"),
μεταφορτώσεις: ψευδής,
}),
}),
MongooseModule.forRootAsync({
inject: [ConfigService],
useFactory: ασυγχρονισμός (configService: ConfigService) => ({
uri: configService.get('MONGO_URI')
})
}),
BooksModule,
],
ελεγκτές: [AppController],
πάροχοι: [AppService],
})

εξαγωγήτάξη AppModule {}

Μπορείτε να δοκιμάσετε τον κώδικα εκτελώντας npm έναρξη εκτέλεσης: dev στο τερματικό σας και η εφαρμογή σας θα πρέπει να ξεκινήσει με επιτυχία στη θύρα 3000.

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

Και εδώ είναι ένα παράδειγμα μετάλλαξης:

Δημιουργήστε αποτελεσματικά API με NestJS και GraphQL

Η δημιουργία ενός GraphQL API στο NestJS με MongoDB χρησιμοποιώντας Mongoose περιλαμβάνει τον καθορισμό ενός σχήματος για το GraphQL API, ένα σχήμα για το μοντέλο Mongoose, μια υπηρεσία για αλληλεπίδραση με τη βάση δεδομένων και έναν αναλυτή για την αντιστοίχιση των λειτουργιών GraphQL στην υπηρεσία μεθόδους.

Το NestJS έχει ενσωματωμένη λειτουργικότητα για τη δημιουργία API, συμπεριλαμβανομένων διακοσμητών για τον καθορισμό διαδρομών, προστατευτικών για την προστασία τους και ενδιάμεσων λογισμικών για τη διαχείριση αιτημάτων και απαντήσεων. Υποστηρίζει επίσης άλλες βάσεις δεδομένων όπως PostgreSQL, MySQL και SQLite, καθώς και άλλες βιβλιοθήκες GraphQL όπως οι Apollo και TypeGraphQL.