Créer un service NestJS
Vue d'ensemble
Ce guide explique comment créer un nouveau service backend NestJS dans le monorepo Feelbat.
Les services backend sont créés dans apps/api et sont gérés par Nx.
Objectif
À la fin de ce guide, vous serez capable de :
- Générer un nouveau service NestJS.
- Adapter sa configuration Nx.
- Configurer ses scripts de build.
- Supprimer la configuration Webpack inutile.
- Typer et valider les variables d'environnement.
Créer le service
Utilisez la commande suivante :
pnpm nest:app apps/api/<service-name>
Exemple :
pnpm nest:app apps/api/my-service
Cette commande génère une nouvelle application NestJS dans apps/api.
Supprimer la configuration Webpack
Par défaut, la génération du service crée un fichier webpack.config.js.
Ce fichier n'est pas utilisé dans la configuration Feelbat et peut être supprimé.
rm apps/api/<service-name>/webpack.config.js
Warning
Ne conservez pas le fichier webpack.config.js si le service utilise la configuration standard décrite dans ce guide.
Configurer le projet Nx
Ouvrez le fichier project.json du service généré.
apps/api/<service-name>/project.json
Modifiez le champ name pour utiliser le nom Nx du projet :
{
"name": "@feelbat/<service-name>"
}
Remplacez ensuite la section targets par la configuration suivante.
{
"targets": {
"build": {
"executor": "nx:run-commands",
"outputs": ["{projectRoot}/dist/"],
"dependsOn": ["^build"],
"options": {
"cwd": "apps/api/<service-name>",
"command": "pnpm build:prod"
},
"configurations": {
"development": {
"command": "pnpm build:dev"
}
}
},
"serve": {
"executor": "@nx/js:node",
"defaultConfiguration": "development",
"continuous": true,
"options": {
"buildTarget": "@feelbat/<service-name>:build",
"runBuildTargetDependencies": false
},
"configurations": {
"development": {
"buildTarget": "@feelbat/<service-name>:build:development"
},
"production": {
"buildTarget": "@feelbat/<service-name>:build:production"
}
}
}
}
}
Tip
Remplacez toutes les occurrences de <service-name> par le nom réel du service.
Configurer le package.json
Ouvrez le fichier package.json du service.
apps/api/<service-name>/package.json
Modifiez le champ name pour utiliser le même nom que dans project.json.
{
"name": "@feelbat/<service-name>"
}
Ajoutez ensuite les scripts de build suivants :
{
"scripts": {
"build:dev": "nest build -p tsconfig.app.json",
"build:prod": "nest build -p tsconfig.app.json"
}
}
Ajouter les dépendances nécessaires
La validation des variables d'environnement repose sur Zod. Si la dépendance n'est pas déjà présente dans le projet, ajoutez-la au package.json.
Comme les versions des dépendances externes sont centralisées dans le monorepo, utilisez catalog:*.
{
"dependencies": {
"zod": "catalog:*"
}
}
Tip
Consultez le guide Gestion des dépendances pour comprendre la différence entre catalog:* et workspace:*, ainsi que les bonnes pratiques d'utilisation de pnpm dans le monorepo.
Typer les variables d'environnement
Créez le fichier suivant :
apps/api/<service-name>/src/env.d.ts
Ce fichier permet de déclarer la shape de process.env côté TypeScript.
declare global {
namespace NodeJS {
interface ProcessEnv {
// Container Configuration
CONTAINER_NAME: string;
MS_REMOTE_ACTION_PORT: string;
MS_ENV: string;
// Database rs-manager
RS_MANAGER_DB_HOST: string;
RS_MANAGER_DB_PORT: string;
RS_MANAGER_DB_USERNAME: string;
RS_MANAGER_DB_PASSWORD: string;
// Kafka
BROKER_HOST: string;
BROKER_PORT: string;
CONSUMER_ID: string;
PRODUCER_ID: string;
}
}
}
export {};
Note
Ce fichier améliore le typage TypeScript, mais il ne valide pas les variables à l'exécution. La validation runtime est faite avec Zod dans l'étape suivante.
Valider les variables d'environnement
Créez le fichier suivant :
apps/api/<service-name>/src/shared/utils/env.ts
Ce fichier valide les variables d'environnement avec Zod au démarrage du service.
import { z } from "zod";
const EnvSchema = z.object({
// Container Configuration
CONTAINER_NAME: z.string(),
MS_REMOTE_ACTION_PORT: z.coerce.number().min(1).max(65535),
MS_ENV: z.string(),
// Database rs-manager
RS_MANAGER_DB_HOST: z.string(),
RS_MANAGER_DB_PORT: z.coerce.number().min(1).max(65535),
RS_MANAGER_DB_USERNAME: z.string(),
RS_MANAGER_DB_PASSWORD: z.string(),
// Kafka
BROKER_HOST: z.string(),
BROKER_PORT: z.coerce.number().min(1).max(65535),
CONSUMER_ID: z.string(),
PRODUCER_ID: z.string(),
});
export const env = EnvSchema.parse(process.env);
Créez ensuite un fichier d'export :
apps/api/<service-name>/src/shared/utils/index.ts
export * from "./env";
Utiliser les variables validées
Une fois le fichier env.ts créé, le service ne doit plus utiliser directement process.env.
Préférez :
import { env } from "./shared/utils";
const port = env.MS_REMOTE_ACTION_PORT;
Au lieu de :
const port = process.env.MS_REMOTE_ACTION_PORT;
Warning
Utiliser directement process.env contourne la validation Zod et peut introduire des erreurs difficiles à détecter.
Vérifier le service
Lancez le service en développement :
pnpm nx run @feelbat/<service-name>:serve:development
Si la configuration est correcte, Nx construit puis lance le service.
À retenir
- Les services NestJS sont créés dans
apps/api. - Le fichier
webpack.config.jsgénéré par défaut doit être supprimé. - Le nom du projet doit être identique dans
project.jsonetpackage.json. - Les targets Nx doivent utiliser la configuration standard du monorepo.
- Les variables d'environnement doivent être typées avec
env.d.tset validées avec Zod. - Le code applicatif doit utiliser
env.<VARIABLE>plutôt queprocess.env.<VARIABLE>.