web:api:prisma-fastify

API REST avec Fastify + Prisma

Objectif :

  • Installer le projet
  • Configurer Fastify
  • Configurer Prisma
  • Créer un modèle
  • Exposer des routes CRUD simples

  • Node.js >= 18
  • PostgreSQL installé

mkdir fastify-prisma-api
cd fastify-prisma-api
npm init -y

Installation dépendances :

npm install fastify @prisma/client
npm install -D prisma typescript ts-node-dev @types/node

Initialiser Prisma :

npx prisma init


Créer `tsconfig.json` :

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "CommonJS",
    "rootDir": "./src",
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true
  }
}

Ajouter dans `package.json` :

"scripts": {
  "dev": "ts-node-dev --respawn src/server.ts"
}


Modifier `prisma/schema.prisma` :

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}
 
generator client {
  provider = "prisma-client-js"
}

DATABASE_URL="file:./dev.db"

Explication :

  • Prisma va créer automatiquement un fichier `dev.db`
  • Le fichier sera situé à la racine du projet

npx prisma migrate dev --name init

Résultat :

  • Fichier dev.db créé
  • Tables générées
  • Client Prisma généré

Aucune base externe nécessaire.


fastify-prisma-api/
 ├── prisma/
 ├── src/
 ├── dev.db
 ├── .env
 ├── package.json

Fichier `.env` :

DATABASE_URL="postgresql://user:password@localhost:5432/fastifydb"

Modifier `prisma/schema.prisma` :

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  createdAt DateTime @default(now())
}

Créer la base :

npx prisma migrate dev --name init


src/
 ├── server.ts
 └── prisma.ts


`src/prisma.ts`

import {PrismaClient} from "@prisma/client/extension";

export const prisma = new PrismaClient()


`src/server.ts`

import Fastify from "fastify"
import { prisma } from "./prisma"

const app = Fastify({ logger: true })

app.get("/posts", async () => {
  return prisma.post.findMany()
})

app.post("/posts", async (request, reply) => {
  const { title, content } = request.body as any

  const post = await prisma.post.create({
    data: { title, content }
  })

  reply.code(201)
  return post
})

app.listen({ port: 3000 }, () => {
  console.log("Server running on http://localhost:3000")
})


  • web/api/prisma-fastify.txt
  • Dernière modification : il y a 10 heures
  • de jcheron