Tutorial

Comment développer une API REST avec Prisma et PostgreSQL

Node.jsAPIDockerPostgreSQLDatabasesTypeScript

L'auteur a choisi le Diversity in Tech Fund​​​​​ pour recevoir un don dans le cadre du programme Write for DOnations.

Introduction

Prisma est une boîte à outils de base de données open source. Il se compose de trois outils principaux :

  • Prisma Client : un constructeur de requêtes automatisé de type sécurisé pour Node.js et TypeScript.
  • Prisma Migrate : un système déclaratif de modélisation et de migration de données.
  • Prisma Studio : une interface graphique permettant de visualiser et de modifier les données de votre base de données.

Ces outils sont conçus pour optimiser la productivité d'un développeur d'applications dans les flux de travail de ses bases de données. L'un des principaux avantages de Prisma réside dans le niveau d'abstraction qu'il offre : Au lieu de trouver des requêtes SQL complexes ou des migrations de schéma, en utilisant Prisma, les développeurs d'applications peuvent travailler avec leur base de données en réfléchissant de manière plus intuitive sur leurs données.

Dans ce tutoriel, vous allez créer une API REST pour une petite application de blogs dans TypeScript à l'aide de Prisma et d'une base de données PostgreSQL. Vous allez configurer votre base de données PostgreSQL localement avec Docker et implémenter des itinéraires API REST en utilisant Express. À la fin du tutoriel, vous disposerez d'un serveur web qui fonctionne localement sur votre machine, capable de répondre aux diverses demandes HTTP et de lire et écrire des données dans la base de données.

Conditions préalables

Ce tutoriel suppose que :

Il vous sera utile d'avoir des connaissances de base sur les API TypeScript et REST, mais pas nécessaire pour suivre ce tutoriel.

Étape 1 — Création de votre projet TypeScript

Au cours de cette étape, vous allez configurer un projet TypeScript simple en utilisant npm. Ce projet constituera la base de l'API REST que vous allez développer tout au long de ce tutoriel.

Tout d'abord, créez un nouveau répertoire pour votre projet :

  • mkdir my-blog

Ensuite, naviguez dans le répertoire et initialisez un projet npm vide. Notez que l'option -y signifie ici signifie que vous ignorez les invites interactives de la commande. Pour parcourir les invites, supprimez -y de la commande :

  • cd my-blog
  • npm init -y

Pour plus d'informations sur ces invites, vous pouvez suivre l'étape 1 dans Comment utiliser les modules Node.js avec npm et package.json.

Vous obtiendrez un résultat similaire à ce qui suit, avec les réponses par défaut en place :

Output
Wrote to /.../my-blog/package.json: { "name": "my-blog", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }

Cette commande crée un fichier package.json minimal qui vous servira de fichier de configuration pour votre projet npm. Vous êtes maintenant prêt à configurer TypeScript dans votre projet.

Exécutez la commande suivante pour procéder à une configuration simple de TypeScript :

  • npm install typescript ts-node @types/node --save-dev

Vous installerez ainsi trois paquets en tant que dépendances de développement dans votre projet :

  • typescript : la chaîne d'outils TypeScript.
  • ts-node : un paquet qui exécutera les applications TypeScript sans compilation préalable à JavaScript.
  • @types/node : les définitions de type TypeScript pour Node.js.

La dernière chose à faire consiste à ajouter un fichier tsconfig.json pour vous assurer que TypeScript est correctement configuré pour l'application que vous allez développer.

Tout d'abord, exécutez la commande suivante pour créer le fichier :

  • nano tsconfig.json

Ajoutez le code JSON suivant dans le fichier :

my-blog/tsconfig.json
{
  "compilerOptions": {
    "sourceMap": true,
    "outDir": "dist",
    "strict": true,
    "lib": ["esnext"],
    "esModuleInterop": true
  }
}

Enregistrez et quittez le fichier.

Il s'agit d'une configuration standard et minimale pour un projet TypeScript. Si vous souhaitez en savoir plus sur les propriétés individuelles du fichier de configuration, vous pouvez les consulter dans la documentation de TypeScript.

Vous avez configuré votre projet TypeScript simple en utilisant npm. Ensuite, vous allez configurer votre base de données PostgreSQL avec Docker et y connecter Prisma.

Étape 2 — Configuration de Prisma avec PostgreSQL

Au cours de cette étape, vous allez installer la CLI Prisma, créer votre fichier de schéma Prisma, configurer PostgreSQL avec Docker et y connecter Prisma. Le schéma Prisma est le fichier de configuration principal de votre configuration Prisma et contient votre schéma de base de données.

Commencez par installer la CLI Prisma avec la commande suivante :

  • npm install @prisma/cli --save-dev

L'une des meilleures pratiques recommande d’installer la CLI Prisma localement dans votre projet (par opposition à une installation globale). Cela permet d'éviter les conflits de versions dans le cas où vous disposeriez de plusieurs projets Prisma sur votre machine.

Ensuite, vous allez configurer votre base de données PostgreSQL en utilisant Docker. Créez un nouveau fichier Docker Compose avec la commande suivante :

  • nano docker-compose.yml

Maintenant, ajoutez le code suivant au fichier nouvellement créé :

my-blog/docker-compose.yml
version: '3.8'
services:
  postgres:
    image: postgres:10.3
    restart: always
    environment:
      - POSTGRES_USER=sammy
      - POSTGRES_PASSWORD=your_password
    volumes:
      - postgres:/var/lib/postgresql/data
    ports:
      - '5432:5432'
volumes:
  postgres:

Ce fichier Docker Compose configure une base de données PostgreSQL qui peut être consultée via le port 5432 du conteneur Docker. Notez également que les informations d'identification de la base de données actuelles sont les suivantes : sammy (utilisateur) et your_password (mot de passe). N'hésitez pas à modifier ces informations d'identification et à utiliser votre nom d'utilisateur et votre mot de passe préférés. Enregistrez et quittez le fichier.

Une fois cette configuration en place, vous pouvez lancer le serveur de base de données PostgreSQL avec la commande suivante :

  • docker-compose up -d

Le résultat de cette commande sera similaire à ce qui suit :

Output
Pulling postgres (postgres:10.3)... 10.3: Pulling from library/postgres f2aa67a397c4: Pull complete 6de83ca23e55: Pull complete . . . Status: Downloaded newer image for postgres:10.3 Creating my-blog_postgres_1 ... done

Vous pouvez vérifier si le serveur de base de données fonctionne avec la commande suivante :

  • docker ps

Vous obtiendrez un résultat similaire à celui-ci :

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8547f8e007ba postgres:10.3 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:5432->5432/tcp my-blog_postgres_1

Maintenant que le serveur de la base de données est en cours d'exécution, vous pouvez créer votre configuration Prisma. Exécutez la commande suivante depuis la CLI Prisma :

  • npx prisma init

Vous obtiendrez le résultat suivant :

Output
✔ Your Prisma schema was created at prisma/schema.prisma. You can now open it in your favorite editor.

Notez que l'une des meilleures pratiques vous recommande de préfixer toutes les invocations de CLI Prisma avec npx. Vous aurez ainsi la certitude que votre installation locale est bien utilisée.

Une fois la commande exécutée, la CLI Prisma aura créé un nouveau dossier appelé prisma dans votre projet. Il contient les deux fichiers suivants :

  • schema.prisma : le fichier de configuration principal de votre projet Prisma (comprendra votre modèle de données).
  • .env : un fichier dotenv qui définit l'URL de connexion de votre base de données.

Pour veiller à ce que Prisma connaisse bien l'emplacement de votre base de données, ouvrez le fichier .env et ajustez la variable de l'environnement DATABASE_URL.

Tout d'abord, ouvrez le fichier .env :

  • nano prisma/.env

Maintenant, vous pouvez configurer la variable d'environnement de la manière suivante :

my-blog/prisma/.env
DATABASE_URL="postgresql://sammy:your_password@localhost:5432/my-blog?schema=public"

Veillez à bien remplacer les informations d'identification de la base de données par les données que vous avez spécifiées dans le fichier Docker Compose. Pour en savoir plus sur le format de l'URL de connexion, consultez les docs Prisma.

Une fois que vous avez terminé, enregistrez et fermez le fichier.

Au cours de cette étape, vous avez configuré votre base de données PostgreSQL avec Docker, installé la CLI Prisma et connecté Prisma à la base de données via une variable d'environnement. Lors de la section suivante, vous configurerez votre modèle de données et créerez les tableaux de votre base de données.

Étape 3 — Configuration de votre modèle de données et création des tableaux de base de données

Au cours de cette étape, vous allez configurer votre data model dans le fichier du schéma Prisma. Ce modèle de données sera ensuite mappé à la base de données avec Prisma Migrate, qui générera et enverra les instructions SQL pour créer les tableaux correspondant à votre modèle de données. Étant donné que vous développez une application de blog, les principales entités de l'application seront les utilisateurs et les publications.

Prisma utilise son propre langage de modélisation des données pour définir la forme des données de votre application.

Tout d'abord, ouvrez votre fichier schema.prisma avec la commande suivante :

  • nano prisma/schema.prisma

Maintenant, ajoutez-y les définitions de modèles suivantes. Vous pouvez placer les modèles au bas du fichier, juste après le bloc generator client :

my-blog/prisma/schema.prisma
. . .
model User {
  id    Int     @default(autoincrement()) @id
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        Int     @default(autoincrement()) @id
  title     String
  content   String?
  published Boolean @default(false)
  author    User?   @relation(fields: [authorId], references: [id])
  authorId  Int?
}

Enregistrez et quittez le fichier.

Vous allez définir deux modèles, que vous nommerez User et Post. Chacun de ces modèles possède un certain nombre de fields qui représentent les propriétés du modèle. Les modèles seront mappés sur les tables de base de données ; les champs représentent les colonnes individuelles.

Notez également qu'il existe une relation de un à plusieurs entre les deux modèles, spécifiés par les champs de relation posts et author sur User et Post. Cela signifie qu'un utilisateur peut être associé à plusieurs publications.

Une fois ces modèles en place, vous pouvez maintenant créer les tableaux correspondants dans la base de données en utilisant Prisma Migrate. Sur votre terminal, exécutez la commande suivante :

  • npx prisma migrate save --experimental --create-db --name "init"

Cette commande crée une nouvelle migration sur votre système de fichiers. Voici un aperçu rapide des trois options disponibles avec la commande :

  • --experimental : requise car Prisma Migrates indique actuellement un état experimental.
  • --create-db : permet à Prisma Migrate de créer la base de données nommée my-blog qui est spécifiée dans l'URL de connexion.
  • --name "init" : spécifie le nom de la migration (sera utilisé pour nommer le dossier de migration créé sur votre système de fichiers).

Le résultat de cette commande sera similaire à ce qui suit :

Output
New datamodel: // This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema datasource db { provider = "postgresql" url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" } model User { id Int @default(autoincrement()) @id email String @unique name String? posts Post[] } model Post { id Int @default(autoincrement()) @id title String content String? published Boolean @default(false) author User? @relation(fields: [authorId], references: [id]) authorId Int? } Prisma Migrate just created your migration 20200811140708-init in migrations/ └─ 20200811140708-init/ └─ steps.json └─ schema.prisma └─ README.md

N'hésitez pas à explorer les fichiers de migration qui ont été créés dans le répertoire prisma/migrations.

Pour exécuter la migration par rapport à votre base de données et créer les tableaux pour vos modèles Prisma, exécutez la commande suivante dans votre terminal :

  • npx prisma migrate up --experimental

Vous obtiendrez le résultat suivant :

Output
. . . Checking the datasource for potential data loss... Database Changes: Migration Database actions Status 20200811140708-init 2 CreateTable statements. Done 🚀 You can get the detailed db changes with prisma migrate up --experimental --verbose Or read about them here: ./migrations/20200811140708-init/README.md 🚀 Done with 1 migration in 206ms.

Prisma Migrate génère maintenant les instructions SQL nécessaires à la migration et les envoie à la base de données. Les instructions SQL qui ont créé les tableaux sont les suivantes :

CREATE TABLE "public"."User" (
  "id" SERIAL,
  "email" text  NOT NULL ,
  "name" text   ,
  PRIMARY KEY ("id")
)

CREATE TABLE "public"."Post" (
  "id" SERIAL,
  "title" text  NOT NULL ,
  "content" text   ,
  "published" boolean  NOT NULL DEFAULT false,
  "authorId" integer   ,
  PRIMARY KEY ("id")
)

CREATE UNIQUE INDEX "User.email" ON "public"."User"("email")

ALTER TABLE "public"."Post" ADD FOREIGN KEY ("authorId")REFERENCES "public"."User"("id") ON DELETE SET NULL ON UPDATE CASCADE

Au cours de cette étape, vous avez défini votre modèle de données dans votre schéma Prisma et créé les tableaux des bases de données correspondants avec Prisma Migrate. À l'étape suivante, vous allez installer Prisma Client dans votre projet afin de pouvoir interroger la base de données.

Étape 4 — Exploration des requêtes Prisma Client dans un script simple

Prisma Client est un constructeur de requêtes automatisé de type sécurisé qui vous permet de lire et d'écrire des données dans une base de données depuis une application Node.js ou TypeScript. Vous l'utiliserez pour accéder à la base de données dans vos itinéraires API REST, en remplaçant les ORM traditionnelles, les requêtes SQL simples, les couches d'accès aux données personnalisées ou toute autre méthode d'échange avec une base de données.

Au cours de cette étape, vous allez installer Prisma Client et vous familiariser avec les requêtes que vous pouvez envoyer. Avant d'implémenter les itinéraires de votre API REST au cours des prochaines étapes, vous allez tout d'abord explorer certaines des requêtes Prisma Client dans un script exécutable simple.

Premièrement, vous pouvez procéder à l'installation de Prisma Client dans votre projet en ouvrant votre terminal et en installant le paquet npm de Prisma Client :

  • npm install @prisma/client

Ensuite, créez un nouveau répertoire que vous nommerez src. Il contiendra vos fichiers sources :

  • mkdir src

Créez maintenant un fichier TypeScript à l'intérieur du nouveau répertoire :

  • nano src/index.ts

Toutes les requêtes de Prisma Client renvoient les promesses auxquelles vous pouvez vous attendre dans votre code. Vous devez donc envoyer les requêtes à l'intérieur d'une fonction async.

Ajoutez le texte standard suivant avec une fonction async qui s'exécutera dans votre script :

my-blog/src/index.ts
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  // ... your Prisma Client queries will go here
}

main()
  .catch((e) => console.error(e))
  .finally(async () => await prisma.disconnect())

Voici une rapide décomposition du texte standard :

  1. Importez le constructeur PrismaClient depuis le paquet @prisma/client npm déjà installé.
  2. Instanciez PrismaClient en appelant le constructeur et en obtenant une instance appelée prisma.
  3. Définissez une fonction async que vous appellerez main dans laquelle vous allez ensuite ajouter vos requêtes Prisma Client.
  4. Appelez la fonction main, tout en détectant toute exception potentielle et en vous assurant que Prisma Client ferme toutes les connexions à la base de données ouvertes, en appelant prisma.disconnect().

Une fois la fonction main en place, vous pouvez commencer à ajouter les requêtes Prisma Client au script. Ajustez index.ts pour que cela ressemble à ce qui suit :

my-blog/src/index.ts
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const newUser = await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@prisma.io',
      posts: {
        create: {
          title: 'Hello World',
        },
      },
    },
  })
  console.log('Created new user: ', newUser)

  const allUsers = await prisma.user.findMany({
    include: { posts: true },
  })
  console.log('All users: ')
  console.dir(allUsers, { depth: null })
}

main()
  .catch((e) => console.error(e))
  .finally(async () => await prisma.disconnect())

Dans ce code, vous utilisez deux requêtes Prisma Client :

  • create : crée un nouvel enregistrement User. Notez que, en réalité, vous utilisez une écriture imbriquée, ce qui signifie que vous créez à la fois un enregistrement User et un enregistrement Post dans la même requête.
  • findMany : lit tous les enregistrements User existants depuis la base de données. Vous fournissez l'option include qui charge également les enregistrements de Post correspondants pour chaque enregistrement User.

Maintenant, exécutez le script avec la commande suivante :

  • npx ts-node src/index.ts

Vous obtiendrez le résultat suivant dans votre terminal :

Output
Created new user: { id: 1, email: 'alice@prisma.io', name: 'Alice' } [ { id: 1, email: 'alice@prisma.io', name: 'Alice', posts: [ { id: 1, title: 'Hello World', content: null, published: false, authorId: 1 } ] }

Remarque : si vous utilisez une interface graphique de base de données, vous pouvez valider si les données ont bien été créées en examinant les tableaux User et Post. Vous pouvez également explorer les données dans Prisma Studio en exécutant npx prisma studio --experimental.

Vous avez maintenant utilisé Prisma Client pour lire et écrire des données dans votre base de données. Au cours des étapes restantes, vous allez appliquer ces nouvelles connaissances pour implémenter les itinéraires dans une API REST échantillon.

Étape 5 — Implémentation de votre premier itinéraire API REST

Au cours de cette étape, vous allez installer Express dans votre application. Express est un framework web populaire pour Node.js que vous utiliserez pour implémenter vos itinéraires API REST dans ce projet. Le premier itinéraire que vous allez implémenter vous permettra de récupérer tous les utilisateurs de l'API en utilisant une requête GET. Les données utilisateur seront récupérées depuis la base de données en utilisant Prisma Client.

Vous pouvez maintenant installer Express avec la commande suivante :

  • npm install express

Étant donné que vous utilisez TypeScript, vous devez également installer les types correspondants en tant que dépendances de développement. Pour cela, exécutez la commande suivante :

  • npm install @types/express --save-dev

Une fois les dépendances installée, vous pouvez configurer votre application Express.

Commencez par rouvrir votre fichier source principal :

  • nano src/index.ts

Maintenant, supprimez l'intégralité du code dans index.ts et remplacez-le par ce qui suit pour lancer votre API REST :

my-blog/src/index.ts
import { PrismaClient } from '@prisma/client'
import express from 'express'

const prisma = new PrismaClient()
const app = express()

app.use(express.json())

// ... your REST API routes will go here

app.listen(3000, () =>
  console.log('REST API server ready at: http://localhost:3000'),
)

Voici une décomposition rapide du code :

  1. Importez PrismaClient et express à partir des paquets npm correspondants.
  2. Instanciez PrismaClient en appelant le constructeur et en obtenant une instance appelée prisma.
  3. Créez votre application Express en appelant express().
  4. Ajoutez le logiciel médiateur express.json() pour avoir la certitude que les données de JSON soient correctement traitées par Express.
  5. Lancez le serveur sur le port 3000.

Maintenant, vous pouvez implémenter votre premier itinéraire. Entre les appels à app.use et app.listen, ajoutez le code suivant :

my-blog/src/index.ts
. . .
app.use(express.json())

app.get('/users', async (req, res) => {
  const users = await prisma.user.findMany()
  res.json(users)
})

app.listen(3000, () =>
console.log('REST API server ready at: http://localhost:3000'),
)

Une fois ajouté, enregistrez et fermez votre fichier. Ensuite, démarrez votre serveur web local en utilisant la commande suivante :

  • npx ts-node src/index.ts

Vous recevrez le résultat suivant :

Output
REST API server ready at: http://localhost:3000

Pour accéder à l'itinéraire /users, vous pouvez pointer votre navigateur vers http://localhost:3000/users ou tout autre client HTTP.

Dans ce tutoriel, vous allez tester tous les itinéraire API REST en utilisant curl, un client HTTP basé sur le terminal.

Note : si vous préférez utiliser un client HTTP basé sur une interface graphique, vous pouvez utiliser des alternatives comme Postwoman ou le Advanced REST Client.

Pour tester votre itinéraire, ouvrez une nouvelle fenêtre ou un nouveal onglet du terminal (afin que votre serveur web local puisse continuer à fonctionner) et exécutez la commande suivante :

  • curl http://localhost:3000/users

Vous obtiendrez les données User que vous avez créées au cours de l'étape précédente : 

Output
[{"id":1,"email":"alice@prisma.io","name":"Alice"}]

Notez que, cette fois, le tableau posts n'est pas inclus, étant donné que vous ne faites pas passer l'option include à l'appel findMany dans l'implémentation de l'itinéraire /users.

Vous avez implémenté votre premier itinéraire API REST au niveau de /users. Au cours de l'étape suivante, vous allez implémenter les autres itinéraires API REST pour ajouter plus de fonctionnalités à votre API.

Étape 6 — Implémentation des itinéraires API REST restants

Au cours de cette étape, vous allez implémenter les autres itinéraires API REST de votre application de blog. À la fin, votre serveur web servira diverses requêtes GET, POST, PUT et DELETE.

Voici un aperçu des différents itinéraires que vous allez implémenter :

Méthode HTTP Itinéraire Description
GET /feed Récupère toutes les publications published.
GET /post/:id Récupère une publication spécifique en utilisant son ID.
POST /user Crée un nouvel utilisateur.
POST /post Crée une nouvelle publication (en tant que draft).
PUT /post/publish/:id Définit le champ published d'une publication comme true.
DELETE post/:id Supprime une publication en utilisant son ID.

Vous pouvez maintenant implémenter le reste des itinéraires Get en premier.

Ouvrez la commande index.ts avec la commande suivante :

  • nano src/index.ts

Ensuite, ajoutez le code suivant une fois l'itinéraire /users  implémenté :

my-blog/src/index.ts
. . .

app.get('/feed', async (req, res) => {
  const posts = await prisma.post.findMany({
    where: { published: true },
    include: { author: true }
  })
  res.json(posts)
})

app.get(`/post/:id`, async (req, res) => {
  const { id } = req.params
  const post = await prisma.post.findOne({
    where: { id: Number(id) },
  })
  res.json(post)
})

app.listen(3000, () =>
  console.log('REST API server ready at: http://localhost:3000'),
)

Enregistrez et fermez votre fichier

Ce code implémente les itinéraires API pour deux requêtes GET :

  • /feed : renvoie une liste des posts publiés.
  • /post/:id : renvoie un post spécifique en utilisant son ID.

Prisma Client est utilisé dans les deux implémentations. Dans l'implémentation de l'itinéraire /feed, la requête que vous envoyez avec Prisma Client filtre pour tous les enregistrements Post pour lesquels la colonne published indique la valeur true. En outre, la requête Prisma Client utilise include pour récupérer les informations liées à l’author pour chaque publication renvoyée. Dans l'implémentation de l'itinéraire /post/:id, faites passer l'ID récupérée depuis le chemin de l'URL afin de lire un enregistrement Post spécifique depuis la base de données.

Vous pouvez arrêter le serveur en utilisant les touches CTRL+C de votre clavier. Ensuite, redémarrez le serveur en utilisant :

  • npx ts-node src/index.ts

Pour tester l'itinéraire /feed, vous pouvez utiliser la commande curl suivante :

  • curl http://localhost:3000/feed

Étant donné qu'aucune publication n'a encore été publiée, la réponse prendra la forme d'un tableau vide :

Output
[]

Pour tester l'itinéraire /post/:id, vous pouvez utiliser la commande curl suivante :

  • curl http://localhost:3000/post/1

Vous obtiendrez la publication que vous avez créée initialement :

Output
{"id":1,"title":"Hello World","content":null,"published":false,"authorId":1}

Ensuite, implémentez les deux itinéraires POST. Ajoutez le code suivant à index.ts après les trois itinéraires GET :

my-blog/src/index.ts
. . .

app.post(`/user`, async (req, res) => {
  const result = await prisma.user.create({
    data: { ...req.body },
  })
  res.json(result)
})

app.post(`/post`, async (req, res) => {
  const { title, content, authorEmail } = req.body
  const result = await prisma.post.create({
    data: {
      title,
      content,
      published: false,
      author: { connect: { email: authorEmail } },
    },
  })
  res.json(result)
})

app.listen(3000, () =>
  console.log('REST API server ready at: http://localhost:3000'),
)

Une fois que vous avez terminé, enregistrez et fermez le fichier.

Ce code implémente les itinéraires API pour deux requêtes POST :

  • /user : crée un nouvel utilisateur dans la base de données.
  • /post : crée une nouvelle publication dans la base de données.

Comme auparavant, Prisma Client est utilisé dans les deux implémentations. Dans le cadre de l'implémentation de l'itinéraire /user, vous faites passer les valeurs depuis le corps de la requête HTTP à la requête create de Prisma Client.

L'itinéraire /post exige un peu plus d'implication. Ici, vous ne pouvez pas faire passer les valeurs directement depuis le corps de la requête HTTP. Au contraire, vous devez d'abord les extraire manuellement afin de les transmettre à la requête Prisma Client. En effet, étant donné que la structure de JSON dans le corps de requête ne correspond pas à la structure attendue par Prisma Client. Vous devez donc créer la structure attendue manuellement.

Vous pouvez tester les nouveaux itinéraires en arrêtant le serveur avec CTRL+C. Ensuite, redémarrez le serveur en utilisant :

  • npx ts-node src/index.ts

Pour créer un nouvel utilisateur via l'itinéraire /user, vous pouvez envoyer la requête POST suivante avec curl :

  • curl -X POST -H "Content-Type: application/json" -d '{"name":"Bob", "email":"bob@prisma.io"}' http://localhost:3000/user

Cela créera un nouvel utilisateur dans la base de données, en donnant le résultat suivant :

Output
{"id":2,"email":"bob@prisma.io","name":"Bob"}

Pour créer une nouvelle publication via l'itinéraire /post, vous pouvez envoyer la requête POST suivante avec curl :

  • curl -X POST -H "Content-Type: application/json" -d '{"title":"I am Bob", "authorEmail":"bob@prisma.io"}' http://localhost:3000/post

Cela créera une nouvelle publication dans la base de données et la connectera à l'utilisateur avec le courriel bob@prisma.io. Cela donne le résultat suivant :

Output
{"id":2,"title":"I am Bob","content":null,"published":false,"authorId":2}

Enfin, vous pouvez implémenter les itinéraires PUT et DELETE.

Ouvrez la commande index.ts avec la commande suivante :

  • nano src/index.ts

Ensuite, une fois les deux itinéraires POST implémentés, ajoutez le code surligné :

my-blog/src/index.ts
. . .

app.put('/post/publish/:id', async (req, res) => {
  const { id } = req.params
  const post = await prisma.post.update({
    where: { id: Number(id) },
    data: { published: true },
  })
  res.json(post)
})

app.delete(`/post/:id`, async (req, res) => {
  const { id } = req.params
  const post = await prisma.post.delete({
    where: { id: Number(id) },
  })
  res.json(post)
})

app.listen(3000, () =>
  console.log('REST API server ready at: http://localhost:3000'),
)

Enregistrez et fermez votre fichier

Ce code implémente les itinéraires API pour une requête PUT et une requête DELETE :

  • /post/publish/:id (PUT) : publie une publication en utilisant son ID.
  • /post/:id (DELETE) : supprime une publication en utilisant son ID.

À nouveau, Prisma Client est utilisé dans les deux implémentations. Dans le cadre de l'implémentation de l'itinéraire /post/publish/:id, l'ID du message à publier est récupéré depuis l'URL et transmis à la requête update de Prisma Client. L'implémentation de l'itinéraire /post/:id qui permet de supprimer une publication dans la base de données renvoie également l'ID de l'URL et le transmet à la requête delete de Prisma Client.

Encore une fois, arrêtez le serveur à l'aide des touches CTRL+C de votre clavier. Ensuite, redémarrez le serveur en utilisant :

  • npx ts-node src/index.ts

Vous pouvez tester l'itinéraire PUT avec la commande curl suivante :

  • curl -X PUT http://localhost:3000/post/publish/2

Cela vous permettra de publier la publication avec une valeur d'ID de 2. Si vous renvoyez la requête /feed, cette publication sera alors incluse dans la réponse.

Enfin, vous pouvez tester l'itinéraire DELETE avec la commande curl suivante :

  • curl -X DELETE http://localhost:3000/post/1

Cela vous permettra de supprimer la publication avec une valeur d'ID de 1. Pour valider le fait que la publication portant cet ID ait été supprimée, vous pouvez renvoyer une requête GET à l'itinéraire /post/1.

Au cours de cette étape, vous avez implémenté les autres itinéraires API REST de votre application de blog. L'API répond maintenant aux diverses requêtes GET, POST, PUT et DELETE et implémente une fonctionnalité pour lire et écrire des données dans la base de données.

Conclusion

Au cours de cet article, vous avez créé un serveur API REST avec plusieurs itinéraires différents pour créer, lire, mettre à jour et supprimer les données utilisateur et de publications pour une application de blog échantillon. À l'intérieur des itinéraires de l'API, vous utilisez le Prisma Client pour envoyer les requêtes correspondantes à votre base de données.

Ensuite, vous pouvez implémenter des itinéraires API supplémentaires ou étendre le schéma de votre base de données en utilisant Prisma Migrate. Veillez à consulter la documentation de Prisma pour en savoir plus sur les divers aspects de Prisma et à explorer quelques exemples de projets prêts à l'exécution dans le référentiel prisma-examples - en utilisant des outils comme les API GraphQL ou grPC.

Creative Commons License