Mise en place de la base de données

  1. Vérifiez que la base de données postgreSQL est installée. Si ce n’est pas le cas, rendez-vous sur le site de postgreSQL qui vous permet de réaliser l’installation gratuitement, et quelque soit le système que vous utilisez.

  2. Intégrez postgreSQL à votre application à l’aide du package node-postgres :

    npm install pg

    Une documentation complète sur ce package se trouve ici.

Utilisation de postgreSQL en mode local

Nous considérons que vous accédez à votre base de données directement depuis l’ordinateur que vous utilisez pour développer votre application Express.js. Le cas d’une application destinée à être déployée sur un site distant n’est pas vue ici.

  1. Dans postgreSQL, créez un shéma persons dans lequel vous créez la table person. Recopiez le code suivant dans un fichier data/pg.sql. Cela vous permettra de réitinialiser votre base de données à tout moment.

    drop schema if exists persons;
    create schema persons;
    set search_path to persons;
    
    create table person
    (
        id serial primary key,
        name varchar
    );
    
    insert into person(name) values('John'),('Rosy'),('Pierre');
  2. Il existe plusieurs manières de gérer les connexions entre une application Express et une base de données postgreSQL. Nous allons ici utiliser le pooling qui est la méthode la plus efficace. Créez un fichier data/pg.js dans lequel vous recopiez le code suivant :

    const {Pool} = require('pg');
    const pool = new Pool({
        user: '<votre nom de login sur postgresql>',
        host: 'localhost',
        database: '<le nom de votre db>',
        password: '<le mot de passe associé>',
        port: 5432
    });

    Remarquez que toutes ces informations, y compris votre mot de passe apparaît en clair dans votre code. Pour éviter cela, vous pouvez utiliser des variables d’environnement dont la valeur par défaut est :

    PGHOST='localhost'
    PGUSER=process.env.USER
    PGDATABASE=process.env.USER
    PGPASSWORD=null
    PGPORT=5432

    Le code devient alors:

    const {Pool} = require('pg');
    const pool = new Pool();

    L’objet Pool ainsi créé est tout ce dont vous avez besoin pour vous connecter à la base de données.

  3. Pour que vos requêtes portent sur le schéma persons, ajoutez le code suivant :

    pool.on('connect', client => {
        client.query('set search_path to persons')
    });

    Ainsi, à chaque connection à la base de données, le schéma de travail sera persons.

  4. Enfin, pour simplifier le code dans le routeur, ajoutez le code suivant :

    module.exports = {
        query: (text, params) => {
            return pool.query(text, params)
        }
    };

    La fonction query définie iici pourra être par la suite utilisée dans le routeur.

  5. Créez un fichier routerPG.sql. Le début de votre fichier comprendra les lignes suivantes :

    const express = require("express");
    const router = express.Router();
    const db = require('./data/pg');
    
    module.exports = router;

    De cette manière, vous pourrez utiliser la fonction db.query définie dans le fichier /data/pg.sql.

  6. Il existe différentes manières d’accéder aux données depuis votre routeur. Nous ne présentons ici qu’une seule méthode, qui apparaît comme étant la plus simple. Quelques explications complémentaires peuvent être trouvées ici :

    router
        .get('/persons',
            async (req, res) => {
                const result = await db.query('select * from person');
                res.json(result.rows);
            })

    La fonction de callback étant asynchrone, nous utilisons le mot-clé await qui permet d’attendre le résultat retourné par la requête, et évite ainsi de créer une nouvelle fonction de callback pour traiter la réponse de la base de données.

  7. Pour créer des requêtes avec arguments, on procède comme suit :

    .get('/persons/:id',
        async (req, res) => {
            const result = await db.query('select * from person where id =$1', [req.params.id]);
            res.json(result.rows);
        })
  8. Pour exécuter un commande d’insertion :

    .post('/persons',
            async (req, res) => {
                await db.query('insert into person(name) values($1)',
                    [req.body.name]
                );
                res.status(201).end()
            })