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.
- Installer la librairie de gestion de configurations de Nest
npm install @nestjs/config - Ajouter le module de configuration à la liste des importations dans
app.modulesrc/app.module.ts@Module({
imports: [
ConfigModule.forRoot(),
//... - Créez un fichier
.envà la racine du projet avec les clés suivantesDATABASE_HOST=
DATABASE_PORT=
DATABASE_NAME=
DATABASE_USER=
DATABASE_PASSWORD= - 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
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
@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,
}),
//...
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éesport: 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éessynchronize: 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
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.
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.)