Aller au contenu principal

33-2 Configuration de Nest pour utiliser une BD

Afin de se connecter à la BD nouvellement créée à partir de Nest, il sera nécessaire d'ajouter une configuration.

De plus, comme on utilisera un ORM, vous devrez installer la bibliothèque de l'ORM utilisé, soit TypeORM. Commençons d'ailleurs par cette première étape.

Installer TypeORM et son connecteur pour PostgreSQL

TypeORM est la librairie avec laquelle vous interagirez directement afin de faire les requêtes à la base de données. Il s'agit d'une interface entre votre code et la base de données facilitant l'interrogation de cette dernière.

Il est possible d'utiliser plusieurs systèmes de BD avec TypeORM. Nous pourrions l'utiliser avec sqlite ou encore MySQL, par exemple.

Au final, c'est pourquoi vous devrez installer TypeORM, ainsi que son connecteur pour Postgres, soit pg.

npm install @nestjs/typeorm typeorm pg

Créer un fichier de configuration .env

Lorsqu'on déploie une application serveur, plusieurs informations sensibles peuvent s'y retrouver. Ces informations sont non seulement sensibles, mais peuvent changer selon l'environnement: développement, test, production (live).

Un bon exemple de cela est le nom, l'utilisateur et le mot de passe de la base de données. Les valeurs seront différentes selon si vous êtes sur votre ordinateur de développement ou sur un vrai serveur de déploiement.

De plus, en temps normal on ne veut pas que ces valeurs se retrouvent sur Git, donc on crée un fichier indépendant qu'on ne publie pas sur git.

Une façon fréquente de gérer ces configurations individuelles ou propres aux environnements de déploiement est d'utiliser un fichier .env contenant ces valeurs.

NestJS supporte l'utilisation de fichiers .env via sa librairie @nestjs/config.

  1. Installer la librairie de gestion de configurations de Nest
    npm install @nestjs/config
  2. Ajouter le module de configuration à la liste des importations dans app.module
    src/app.module.ts
    @Module({
    imports: [
    ConfigModule.forRoot(),
    //...
  3. Créez un fichier .env à la racine du projet avec les clés suivantes
    DATABASE_HOST=
    DATABASE_PORT=
    DATABASE_NAME=
    DATABASE_USER=
    DATABASE_PASSWORD=
  4. Complétez le fichier avec vos informations de base de données. Par exemple, dans mon cas:
    DATABASE_HOST=localhost
    DATABASE_PORT=5432
    DATABASE_NAME=houdini
    DATABASE_USER=postgres
    DATABASE_PASSWORD=admin
attention

Il est possible que vos valeurs soient différentes, particulièrement le mot de passe!

Ajouter la configuration TypeORM à AppModule

Finalement, pour connecter NestJS à la base de données lors du démarrage du serveur via TypeORM, on ajoute le module TypeORM et sa configuration dans le fichier AppModule

src/app.module.ts
@Module({
imports: [
ConfigModule.forRoot(),
I18nModule.forRoot({
fallbackLanguage: 'fr',
loaderOptions: {
path: path.join(__dirname, '/i18n/'),
watch: true,
},
resolvers: [
{ use: QueryResolver, options: ['lang'] },
AcceptLanguageResolver,
new HeaderResolver(['x-lang']),
],
}),
TypeOrmModule.forRoot({
type: 'postgres',
host: process.env.DATABASE_HOST,
port: +process.env.DATABASE_PORT!,
username: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
entities: [],
synchronize: true,
logging: true,
}),

//...
info

L'utilisation de process.env fait référence au fichier d'environnement .env.

De plus, on indique à l'application (via AppModule), d'importer le module TypeOrm et on en profite pour en faire la configuration.

Les paramètres importants:

  • type: le type de base de données et le connecteur à utiliser (postgres)
  • host: l'hôte à contacter pour se connecter à la base de données
  • port: le port pour se connecter à la base de données (5432 est le port par défaut de Postgres)
  • username/password/database: les informations de la base de données
  • synchronize: les tables et colonnes dans la base de données seront créées automatiquement à partir de nos entités (!)
  • logging: toutes les requêtes SQL effectuées par Nest seront affichées dans la console. Ce n'est pas obligatoire, mais le fait de voir les requêtes nous aidera à mieux comprendre la "magie" derrière l'ORM.

Démarrer l'application

Au démarrage de l'application, si votre connexion BD est fonctionnelle, vous pourrez apercevoir dans les log que la requête SQL suivante est effectuée:

 SELECT * FROM current_schema()
SELECT version();
START TRANSACTION
SELECT * FROM "information_schema"."tables" WHERE "table_schema" = 'public' AND "table_name" = 'typeorm_metadata'
COMMIT

info

La raison d'être de cette requête est que TypeORM doit se renseigner sur la structure de la base de données afin de savoir s'il y a eu des changements au niveau des entités, et donc, s'il doit effectuer des synchronisations comme ajouter une colonne ou encore une table.

attention

SI vous obtenez une erreur du genre:

[Nest] 82611  - 10/19/2023, 12:31:57 PM   ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
Error: connect ECONNREFUSED ::1:3306

C'est que vos informations de base de données ne permettent pas de s'y connecter (nom d'utilisateur, mot de passe, etc.)

attention