Interroger des bases de données avec Knex.js

Intro to Knex

Knex.js est un constructeur de requêtes « batteries incluses » pour PostgreSQL, MySQL, SQLite3, Oracle, Amazon Redshift et de nombreux autres pilotes de bases de données. Il suffit d’installer la bibliothèque Knex et le pilote approprié pour interroger la base de données. Principalement conçu pour Node.js, Knex prend en charge les callbacks et les promesses de style Node. Dans cet article, nous allons nous pencher sur l’interrogation d’une base de données Postgres avec Knex.

Connexion de Knex avec Postgres

Pour utiliser Knex et Postgres, nous devrons d’abord faire installer Knex et le pilote pg dans l’app.

npm install pg knex --save

Après l’installation des dépendances, l’étape suivante consiste à établir la connexion à pg. Cela se fait plus ou moins de la même manière que la façon dont nous établissons traditionnellement la connexion pg dans les apps Node. Nous spécifions les paramètres de connexion pour Postgres et indiquons à Knex de se connecter au client pg.

const db = require("knex")({ client: "pg", connection: { host: "localhost", user: "postgres", password: "", database: "knex-test" }});app.set("db", db);

Une fois la connexion établie, nous allons ensemencer les données sans écrire de requêtes avec Knex et faker.js. J’utilise Postman et pgAdmin pour tester les API que nous construisons.

Seeding dump data

Knex fournit beaucoup d’aides intégrées pour construire notre schéma de table. J’ai utilisé la fonction intégrée createTable pour créer une table appelée users si la table n’existe pas. Faker.js nous aide à introduire des données factices dans la table. J’utilise la méthode intégrée .insert pour insérer des données dans la table des utilisateurs que nous venons de créer. Tout cela se produit lorsque nous atteignons la route http:localhost:3000/seed.

router.get("/seed", function(req, res, next) { const db = req.app.get('db'); db.schema.hasTable("users").then(function(exists) { if (!exists) { db.schema .createTable("users", function(table) { table.increments("id").primary(); table.string("name"); table.string("email"); }) .then(function() { const recordsLength = Array.from(Array(100).keys()); const records = recordsLength.map(rec => ({ name: faker.name.findName(), email: faker.internet.email() })); db("users") .insert(records) .then(() => { res.send("Seeded data"); }); }); } else { res.send("Table exists - Seeded data"); } });});

Si vous avez installé pgAdmin, vous pouvez rapidement jeter un coup d’oeil aux données insérées. Si tout va bien, vous verrez la réponse « Seed data » sur votre navigateur ou sur l’interface Postman. Lorsque vous essayez de relancer l’itinéraire, il répondra par « Table exists – Seeded data. »

Capture d'écran de nos données semées dans une table

Capture d'écran de nos données semées dans une table

Recherche, insertion et suppression de données

Recherche de toutes les données

Knex rend la recherche vraiment simple. Je vais écrire un service qui peut récupérer, mettre à jour, supprimer et créer des utilisateurs. Avec Knex, l’interrogation des données de la base de données Postgres est aussi simple que :

getAllUsers(db) { return db .select("*") .from("users") .then(rows => rows); }

Je vais créer une route get pour récupérer tous les utilisateurs dans la base de données. Lorsque ce point de terminaison est pingué depuis Postman, Knex construit la requête pour les données que nous demandons et renvoie les données.

router .route("/") .get(function(req, res) { const db = req.app.get("db"); UsersService.getAllUsers(db).then(data => { res.send(data); }); })

Insertion de données

Insérer un nouvel utilisateur dans la base de données est également simple. Je vais créer une méthode .post à la route que nous avons déjà créée et mettre à jour le usersService.js avec une requête pour insérer des données dans la base de données pg.

const UsersService = { insertUser(db, newUser) { return db .insert(newUser) .into("users") .returning("*") .then(rows => { return rows; }); }};module.exports = UsersService;

La route mise à jour ressemble à :

router.route('/') .get(function(req, res, next) { const db = req.app.get("db"); UsersService.getAllUsers(db).then(data => { res.send(data); }); }) .post(function(req, res) { const db = req.app.get("db"); UsersService.insertUser(db, req.body).then(data => { res.send(data); }); });

Mise à jour, suppression et récupération de données particulières

Je vais regrouper les routes de mise à jour, de suppression et de récupération par ID utilisateur ensemble.

router .route("/:id") .get(function(req, res) { const db = req.app.get("db"); UsersService.getById(db, req.params.id).then(data => { res.send(data); }); }) .patch(function(req, res) { const db = req.app.get("db"); UsersService.updateUser(db, req.params.id, req.body).then(() => { res.status(204).end(); }); }) .delete(function(req, res) { const db = req.app.get("db"); UsersService.deleteUser(db, req.params.id).then(data => { res.status(204).end(); }); });

La recherche d’informations spécifiques à partir de Knex est assez simple. Dans cet exemple, nous utilisons une combinaison de select, update, et delete avec une clause where pour choisir les utilisateurs par ID et modifier leurs informations. Le usersService.js ressemble à :

const UsersService = { getById(db, id) { return db .from("users") .select("*") .where("id", id) .first(); }, deleteUser(db, id) { return db("users") .where({ id }) .delete(); }, updateUser(db, id, userFields) { return db("users") .where({ id }) .update(userFields); }};module.exports = UsersService;

En frappant la route GET, PATCH ou DELETE avec l’ID d’utilisateur approprié, nous pourrons voir, modifier ou supprimer les informations de l’utilisateur de la base de données.

La version complète de usersService.js et les routes sont poussées dans ce dépôt sur GitHub.

Pros et cons de Knex.js

Pros:
  1. Nous aide à écrire moins de requêtes SQL : Knex sait à quel système de base de données vous vous connectez et modifiera le SQL qu’il écrit pour correspondre
  2. Semble plus à la programmation avec JavaScript
  3. Les migrations et l’ensemencement sont beaucoup plus simples
Cons:
  1. Vous devriez toujours prendre le temps d’apprendre les manipulations db à un niveau plus profond
  2. Knex nécessite une courbe d’apprentissage. C’est une bibliothèque en soi, et le développeur doit connaître son chemin à fond pour utiliser Knex
  3. Si vous êtes un débutant qui essaie de construire des API, il vaut mieux choisir le chemin difficile que le chemin heureux. Écrire des requêtes vous-même vous rendra plus compétent et plus à l’aise avec les bases de données que d’utiliser un constructeur de requêtes comme Knex

Vous ajoutez de nouvelles bibliothèques JS pour améliorer les performances ou construire de nouvelles fonctionnalités ? Et s’ils font l’inverse ?

Il ne fait aucun doute que les frontends deviennent plus complexes. À mesure que vous ajoutez de nouvelles bibliothèques JavaScript et d’autres dépendances à votre application, vous aurez besoin de plus de visibilité pour vous assurer que vos utilisateurs ne rencontrent pas de problèmes inconnus.

LogRocket est une solution de surveillance des applications frontales qui vous permet de rejouer les erreurs JavaScript comme si elles se produisaient dans votre propre navigateur afin que vous puissiez réagir aux bugs plus efficacement.

LogRocket Dashboard Free Trial Bannerhttps://logrocket.com/signup/

LogRocket fonctionne parfaitement avec n’importe quelle app, quel que soit le framework, et dispose de plugins pour enregistrer le contexte supplémentaire de Redux, Vuex et @ngrx/store. Au lieu de deviner pourquoi les problèmes surviennent, vous pouvez agréger et rendre compte de l’état dans lequel se trouvait votre application lorsqu’un problème est survenu. LogRocket surveille également les performances de votre application, en rapportant des métriques telles que la charge CPU du client, l’utilisation de la mémoire du client, et plus encore.

Construisez en toute confiance – Commencez à surveiller gratuitement.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.