Maison > interface Web > js tutoriel > le corps du texte

Dockerize l'application PERN-TypeScript à l'aide de Prisma ORM avec Docker Compose

Patricia Arquette
Libérer: 2024-10-17 06:29:29
original
700 Les gens l'ont consulté

Dockerize PERN-TypeScript App Using Prisma ORM With Docker Compose

Introduction

Cet article n'entrera pas dans les explications détaillées. Au lieu de cela, je vais simplement fournir les extraits de code dont vous avez besoin pour dockeriser une application de pile PERN. Si vous souhaitez une explication plus détaillée, consultez cet article où j'ai tout couvert plus en profondeur.

La structure du projet

pern-project/
--- frontend/
------ .dockerignore
------ frontend.dockerfile
------ ...
--- backend/
------ .dockerignore
------ backend.dockerfile
------ ...
--- docker-compose.yml
Copier après la connexion

Moteur de code

Créez d'abord une application node.js-express.js :

mkdir backend && cd backend
npm init -y
Copier après la connexion

Installez toutes les dépendances nécessaires depuis npm :

npm install express dotenv cors
Copier après la connexion

Installez également les dépendances de développement liées à Typescript :

npm install --save-dev typescript ts-node @types/express @types/node @types/cors
Copier après la connexion

Générer le fichier tsconfig.json :

tsc --init
Copier après la connexion

Remplacez tout ce qui se trouve dans tsconfig.json par ce morceau de code ci-dessous :

{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "rootDir": "./src",
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*.ts", "data-types.d.ts"]
}
Copier après la connexion

Créez le dossier src et le fichier index.ts dans le dossier src. Alors maintenant, la structure des dossiers backend :

backend/
--- node_modules/
--- src/
------ index.ts
--- package.json
--- tsconfig.json
--- ...
Copier après la connexion

Intégrer Postgres à Prisma

Installez d'abord Prisma et Prisma Client :

npm i @prisma/client
npm i --save-dev prisma
Copier après la connexion

Générer un dossier prisma :

npx prisma init
Copier après la connexion

Écrivez un modèle utilisateur dans le fichier schema.prisma :

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

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

model User {
  id        String   @id @default(uuid())
  name      String
  username  String
  email     String
  password  String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@map("users")
}
Copier après la connexion

Définissez DATABASE_URL dans le fichier .env :

DATABASE_URL=postgresql://postgres:postgres@db:5432/pern_db?schema=public
Copier après la connexion

Créez un fichier prismadb.ts dans le dossier src :

import { PrismaClient } from "@prisma/client"
import "dotenv/config"

// Extend the global object with PrismaClient
declare global {
  var prisma: PrismaClient | undefined
}

// Prevent multiple instances of Prisma Client in development
const prisma = global.prisma || new PrismaClient()

if (process.env.NODE_ENV !== "production") global.prisma = prisma

export default prisma
Copier après la connexion

Définissez le point de terminaison /register dans le fichier index.ts. Le fichier index.ts :

import express, { Request, Response } from "express"
import "dotenv/config"
import cors from "cors"
import { corsOptions } from "./constants/config"

const app = express()
const PORT = process.env.PORT || 3000

app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use(cors({
    const corsOptions = {
    origin: process.env.CLIENT_URL || 'http://localhost:5173',
    credentials: true,
  }
}))

app.get("/", (req: Request, res: Response) => {
  res.json({
    message: "Hello, TypeScript with Express! Updated!",
  })
})

app.post("/register", async (req: Request, res: Response) => {
  const { name, username, email, password } = req.body

  await prisma.user.create({
    data: {
      name,
      username,
      email,
      password,
    },
  })

  res.json({
    message: "User created successfully",
  })
})

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`)
})

Copier après la connexion

Fichier Docker back-end

Créez un fichier nommé backend.dockerfile à la racine du répertoire backend et écrivez :

FROM node:20
WORKDIR /app
COPY package*.json .
RUN npm install
COPY prisma ./prisma
RUN npx prisma generate
COPY . .
EXPOSE 3000
RUN npm install -g nodemon ts-node
CMD ["nodemon", "src/index.ts"]
Copier après la connexion

Pour exclure les node_modules, créez un fichier .dockerignore :

node_modules
Copier après la connexion

Interface de code

Créer le frontend :

npm create vite@latest frontend -- --template react-ts
Copier après la connexion

Faire un appel API dans l'application React :

// App.tsx

import { FormEvent, useEffect, useState } from "react"
....

function App() {
  const [name, setName] = useState("")
  const [username, setUsername] = useState("")
  const [email, setEmail] = useState("")
  const [password, setPassword] = useState("")

  const saveUser = async (e: FormEvent) => {
    e.preventDefault()
    await fetch("http://localhost:3000/register", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        name,
        username,
        email,
        password,
      }),
    })
      .then((res) => res.json())
      .then((data) => console.log(data))
  }

  useEffect(() => {
    fetch("http://localhost:3000")
      .then((res) => res.json())
      .then((data) => console.log(data))
  }, [])

  return (
    <>
      <form onSubmit={saveUser}>
        <input
          type="text"
          onChange={(e) => setName(e.target.value)}
          placeholder="Enter your name"
        />
        <input
          type="text"
          onChange={(e) => setUsername(e.target.value)}
          placeholder="Enter your username"
        />
        <input
          type="email"
          onChange={(e) => setEmail(e.target.value)}
          placeholder="Enter your email"
        />
        <input
          type="password"
          onChange={(e) => setPassword(e.target.value)}
          placeholder="Enter your password"
        />
        <button type="submit">Submit</button>
      </form>
    </>
  )
}

export default App
Copier après la connexion

Fichier Docker frontal

Créez un fichier nommé frontend.dockerfile à la racine du répertoire frontend et écrivez :

FROM node:20
WORKDIR /app
COPY package*.json .
RUN npm install
EXPOSE 5173
COPY . .
CMD [ "npm", "run", "dev" ]
Copier après la connexion

Fichier Docker-Compose

Ajoutez ce qui suit dans le fichier .env du dossier backend :

// backend/.env

POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=pern_db

DATABASE_URL=postgresql://postgres:postgres@db:5432/pern_db?schema=public
Copier après la connexion

Le fichier docker-compose.yml :

services:
  frontend:
    container_name: frontend
    build:
      context: ./frontend
      dockerfile: frontend.dockerfile
    ports:
      - "5173:5173"
    networks:
      - pern_net
    volumes:
      - ./frontend:/app
      - /app/node_modules
    depends_on:
      - server

  backend:
    container_name: backend
    build:
      context: ./backend
      dockerfile: backend.dockerfile
    env_file:
      - ./backend/.env
    ports:
      - "3000:3000"
    networks:
      - pern_net
    volumes:
      - ./backend:/app
      - /app/node_modules
    depends_on:
      - db

  db:
    container_name: db
    image: postgres:14
    restart: always
    ports:
      - "5432:5432"
    networks:
      - pern_net
    env_file:
      - ./backend/.env
    volumes:
      - pgdata:/data/db

networks:
  pern_net:
    driver: bridge

volumes:
  pgdata: {}
Copier après la connexion

Exécutez cette commande :

docker compose up -d
Copier après la connexion

Migrer le schéma prisma :

docker backend -it backend npx prisma migrate dev --name init
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal