Cette série présente aux développeurs NESTJS. La partie 2 montre comment configurer une base de données SQL Azure, créer des points de terminaison et effectuer des opérations CRUD.
Il s’agit de la deuxième partie de la série NESTJS Learning. La partie 1 couverte la configuration du projet Nest.
Dans cette partie, nous couvrirons les sujets suivants:
- Connexion à la base de données SQL Azure
- Configuration de la chaîne de connexion
- Points de terminaison pour les opérations CRUD
Configuration de la base de données
MySQL Azure a une base de données appelée nomadcoder. Dans cet article, nous nous connecterons à cette base de données et effectuerons des opérations CRUD sur une table d’entreprise. Nous allons créer la table du livre à partir du code lui-même.
Pour vous connecter à SQL Azure, vous aurez besoin d’une chaîne de connexion, qui peut être trouvée sur la page d’aperçu de la base de données.
Cliquez sur les chaînes de connexion, puis accédez à l’onglet ODBC pour trouver la chaîne de connexion pour l’API Nest.
Pour vous connecter à SQL Azure, vous devez installer le Pilote ODBC sur votre ordinateur. S’il n’est pas installé, vous pouvez le télécharger.
Installation des dépendances requises
Nous utiliserons Typeorm pour nous connecter à SQL Azure, alors installez les dépendances répertoriées ci-dessous dans votre projet.
npm install @nestjs/typeorm
npm install typeorm mssql
Configuration de TypeOR
Pour configurer Typetr dans le projet, mettez à jour le fichier app.module.ts ci-dessous. Inclure le TypeOrmModule
dans le tableau des importations du module.
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mssql',
host: '<your-sql-azure-server>.database.windows.net',
port: 1433,
username: '<your-username>',
password: '<your-password>',
database: '<your-database>',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
options: {
encrypt: true,
},
}),
],
Mettez à jour les valeurs suivantes:
- Hôte: réglé sur votre serveur de base de données SQL Azure
- Nom d’utilisateur: réglé sur votre nom d’utilisateur de base de données SQL Azure
- Mot de passe: réglé sur le mot de passe pour cet utilisateur
- Base de données: réglé sur le nom de votre base de données
- Synchroniser: Utilisez True pour le développement et faux pour la production
Création d’entité
Nous devons d’abord définir une entité correspondant à une table de base de données pour implémenter les points de terminaison CRUD. Étant donné que Nest CLI ne fournit pas de commande pour générer des entités, nous les créerons manuellement.
Nous migrerons le tableau des livres de l’article précédent vers une base de données Azure SQL. Pour commencer, créez un nouveau fichier nommé livre.entity.ts à l’intérieur du dossier du livre.
Lorsque vous travaillez avec Typeorm, le fichier d’entité doit être nommé avec l’extension .entity.ts. Nous pouvons créer la classe d’entités de l’entreprise comme indiqué ci-dessous:
book.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class Book {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
author: string;
}
TypeOrt utilisera le Book
classe en tant qu’entité. Les entités de TypeOR représentent des tableaux dans une base de données, et chaque instance de classe correspond à une ligne dans ce tableau.
Le @Entity()
Le décorateur marque la classe en tant qu’entité de base de données, donc Typeorm sait créer une table pour cela. Chaque propriété de la classe est décorée avec @PrimaryGeneratedColumn()
ou @Column()
qui indique à Typeorm comment mapper ces propriétés aux colonnes dans la table de la base de données.
Une fois le Book
L’entité a été ajoutée au projet, l’inclure dans le tableau d’importations de l’Appmodule comme indiqué ci-dessous.
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mssql',
host: 'nomadcoder.database.windows.net',
port: 1433,
username:’’,
password: '',
database: 'nomadcoder',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
options: {
encrypt: true,
},
}),
TypeOrmModule.forFeature([Book]),
],
À ce stade, lorsque vous exécutez l’application, une table de livres sans données ne sera créée dans la base de données Azure SQL.
Insérer un record
Nous implémenterons la logique pour insérer un enregistrement de livre dans le BookService
classe. Pour effectuer des opérations de base de données, importez le référentiel à partir de Typeorm et injectez-le dans le constructeur du service.
import { Book } from './book.entity';
import { Repository } from 'typeorm';
@Injectable()
export class BookService {
constructor(
@InjectRepository(Book)
private readonly bookRepository: Repository<Book>,
) {}
}
Pour insérer un enregistrement de livre, utilisez la fonction de création de la classe de référentiel comme indiqué ci-dessous:
async create(bookData: Partial<Book>): Promise<Book> {
const book = this.bookRepository.create(bookData);
return this.bookRepository.save(book);
}
BookRepository.create(bookData)
est appelé à l’intérieur de la méthode de création asynchrone. Cela crée un nouveau Book
Instance d’entité utilisant les données fournies.
La ligne suivante est bookRepository.save(book)
qui enregistre l’entité nouvellement créée à la base de données et renvoie le Book
objet. La méthode de sauvegarde est asynchrone et renvoie une promesse qui se résout à l’entité persistante.
Dans le BookController
Ajoutez un point de terminaison post pour insérer un nouveau livre.
@Post()
async create(@Body() bookData: Partial<Book>, @Res() res: Response) {
try {
const book = await this.bookService.create(bookData);
return res.status(HttpStatus.CREATED).json(book);
} catch (error) {
return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error creating book' });
}
}
La méthode de création asynchrone accepte deux paramètres: @Body() bookData: Partial<Book>
et @Res() res: Response
.
Le @Body()
décorateur extrait et cartographie le corps de la demande au bookData
. Comme le bookData
le type est partiel, le client peut envoyer un objet avec une partie ou la totalité du Book
propriétés.
Le @Res()
Le décorateur injecte l’objet de réponse brut, permettant un contrôle manuel sur la réponse HTTP.
À l’intérieur de la méthode, un bloc d’essai gère les erreurs. Le code tente de créer un nouveau livre en appelant bookService.create(bookData)
.
En cas de succès, il envoie une réponse avec le code d’état HTTP 201 (créé) et le livre nouvellement créé en tant que JSON. Si une erreur se produit pendant le processus, le bloc de capture envoie une réponse de 500 (erreur du serveur interne) avec un message d’erreur.
Lorsque vous envoyez une demande de message à http: // localhost: 3000 / livre avec un objet de livre dans le corps de la demande, une nouvelle ligne doit être insérée dans la table du livre.
{
"id": 1,
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald"
}
Recherche des enregistrements
Pour récupérer les données de la table SQL Azure Book, nous utiliserons les fonctions de référentiel de Typeorm.
async findAll(): Promise<Book[]> {
return this.bookRepository.find();
}
async findOne(id: number): Promise<Book | null> {
return this.bookRepository.findOneBy({ id });
}
Nous utilisons les méthodes de modèle de référentiel de Typeorm. Le bookRepository.find()
La fonction récupère tous les enregistrements du livre de la base de données, tandis que bookRepository.findOneBy({ id })
Rechet un livre spécifique par son identifiant. Si un livre correspondant est trouvé, il est retourné; Sinon, la méthode renvoie null.
Dans le BookController
Ajoutez des points de terminaison pour récupérer des livres ou un livre particulier.
@Get()
async findAll(@Res() res: Response) {
try {
const books = await this.bookService.findAll();
return res.status(HttpStatus.OK).json(books);
} catch (error) {
return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error fetching books' });
}
}
- Le
findAll()
la méthode est asynchrone et prend un paramètre@Res() res: Response
pour la gestion des réponses personnalisées. - Il utilise
bookService.findAll()
Fonction pour récupérer tous les livres de la base de données. - La méthode répond avec HTTP Status 200 (OK) et les données du livre au format JSON.
- Si une erreur se produit pendant le processus, le bloc Catch envoie une réponse de 500 (erreur du serveur interne) avec un message d’erreur approprié.
Pour récupérer un livre particulier avec l’ID, ajoutez l’endoint comme ci-dessous.
@Get(':id')
async findOne(@Param('id') id: string, @Res() res: Response) {
try {
const book = await this.bookService.findOne(Number(id));
if (book) {
return res.status(HttpStatus.OK).json(book);
} else {
return res.status(HttpStatus.NOT_FOUND).json({ message: 'Book not found' });
}
} catch (error) {
return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error fetching book' });
}
}
- Le
findOne()
La méthode est asynchrone et prend deux paramètres:@Param('id') id: string
et@Res() res: Response
. - Le
@Param('id')
le décorateur extrait la valeur d’ID de l’URL et@Res()
pour la gestion des réponses personnalisées. Il utilisebookService.findOne()
Fonction pour récupérer un livre particulier à partir de la base de données. - La méthode répond avec HTTP Status 200 (OK) et les données du livre au format JSON si un livre est trouvé.
- Si aucun livre n’est trouvé, il répond avec HTTP Status 404 (non trouvé) et un message indiquant que le livre n’a pas été trouvé.
- Si une erreur se produit pendant le processus, le bloc Catch envoie une réponse de 500 (erreur du serveur interne) avec un message d’erreur approprié.
Lorsque vous envoyez une demande de GET à http: // localhost: 3000 / livrevous devriez obtenir tous les livres. Et lorsque vous envoyez une demande de GET à http: // localhost: 3000 / book / 1vous devriez obtenir le livre particulier avec ID 1.
Suppression d’un record
Pour supprimer les données de la table du livre, nous utiliserons les fonctions de référentiel de Typeorm.
async remove(id: number): Promise<DeleteResult> {
return this.bookRepository.delete(id);
}
Nous utilisons le typeorm bookRepository.delete()
Fonction pour supprimer l’enregistrement avec l’ID donné de la table du livre.
Dans le BookController
Ajoutez des points de terminaison supprimés pour supprimer un livre avec l’ID donné comme indiqué ci-dessous:
@Delete(':id')
async remove(@Param('id') id: string, @Res() res: Response) {
try {
const result = await this.bookService.remove(Number(id));
if (result.affected && result.affected > 0) {
return res.status(HttpStatus.NO_CONTENT).send();
} else {
return res.status(HttpStatus.NOT_FOUND).json({ message: 'Book not found' });
}
} catch (error) {
return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error deleting book' });
}
}
- Le
remove()
La méthode est asynchrone et prend deux paramètres:@Param('id') id: string
et@Res() res: Response
. - Le
@Param('id')
le décorateur extrait la valeur d’ID de l’URL et@Res()
pour la gestion des réponses personnalisées. Il utilisebookService.remove()
Fonction pour supprimer un livre particulier de la base de données. - Si aucun livre n’est trouvé, il répond avec HTTP Status 404 (non trouvé) et un message indiquant que le livre n’a pas été trouvé.
- Si une erreur se produit pendant le processus, le bloc Catch envoie une réponse de 500 (erreur du serveur interne) avec un message d’erreur approprié.
Pour supprimer un livre particulier avec l’ID 1, effectuez une opération de suppression sur le point de terminaison http: // localhost: 3000 / book / 1.
Mise à jour d’un enregistrement
Pour mettre à jour les données dans la table du livre, nous utiliserons la mise à jour de la fonction du référentiel de Typeorm.
async update(id: number, updateData: Partial<Book>): Promise<Book | null> {
await this.bookRepository.update(id, updateData);
return this.bookRepository.findOneBy({ id });
}
Nous utilisons le typeorm bookRepository.update()
Fonction pour mettre à jour l’enregistrement avec l’ID donné de la table du livre, puis chercher cet enregistrement mis à jour particulier.
Dans le BookController
ajouter des points de terminaison pour mettre à jour un livre avec l’ID donné comme indiqué ci-dessous:
@Put(':id')
async update(
@Param('id') id: string,
@Body() updateData: Partial<Book>,
@Res() res: Response
) {
try {
const updatedBook = await this.bookService.update(Number(id), updateData);
if (updatedBook) {
return res.status(HttpStatus.OK).json(updatedBook);
} else {
return res.status(HttpStatus.NOT_FOUND).json({ message: 'Book not found' });
}
} catch (error) {
return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error updating book' });
}
}
- Le
update()
La méthode est asynchrone et prend trois paramètres:@Param('id') id: string
,updateData
Pour mettre à jour le livre et@Res() res: Response
. - Le
@Param('id')
le décorateur extrait la valeur d’ID de l’URL et@Res()
pour la gestion des réponses personnalisées. Il utilisebookService.update()
Fonction pour mettre à jour un livre particulier à partir de la base de données. - Si aucun livre n’est trouvé, il répond avec HTTP Status 404 (non trouvé) et un message indiquant que le livre n’a pas été trouvé.
- Si une erreur se produit pendant le processus, le bloc Catch envoie une réponse de 500 (erreur du serveur interne) avec un message d’erreur approprié.
Pour mettre à jour un livre particulier avec l’ID 1, effectuez une opération de put sur le point final http: // localhost: 3000 / book / 1.
Résumé
Dans cette partie de la série NESTJS d’apprentissage en plusieurs parties, vous avez développé une API capable d’effectuer des opérations CRUD sur une table SQL Azure. J’espère que vous avez trouvé cette section utile – merci pour suivre!
Source link