Interrogare i database con Knex.js

Introduzione a Knex

Knex.js è un costruttore di query “a batterie” per PostgreSQL, MySQL, SQLite3, Oracle, Amazon Redshift, e molti altri driver di database. Basta installare la libreria Knex e il driver appropriato per interrogare il database. Realizzato principalmente per Node.js, Knex supporta sia le callback in stile Node che le promesse. In questo articolo, vedremo come interrogare un database Postgres con Knex.

Collegare Knex con Postgres

Per usare Knex e Postgres, dobbiamo prima installare Knex e il driver pg nell’app.

npm install pg knex --save

Dopo aver installato le dipendenze, il passo successivo è stabilire la connessione a pg. Specifichiamo i parametri di connessione per Postgres e puntiamo Knex per connettersi al client pg.

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

Una volta stabilita la connessione, andiamo a seminare i dati senza scrivere alcuna query con Knex e faker.js. Sto usando Postman e pgAdmin per testare le API che stiamo costruendo.

Seminare i dati di dump

Knex fornisce molti helper integrati per costruire il nostro schema di tabella. Ho usato la funzione integrata createTable per creare una tabella chiamata users se la tabella non esiste. Faker.js ci aiuta a inserire dati fittizi nella tabella. Sto usando il metodo built-in .insert per inserire i dati nella tabella degli utenti che abbiamo appena creato. Tutto questo accade quando colpiamo il percorso 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"); } });});

Se avete pgAdmin installato, potete dare rapidamente un’occhiata ai dati seminati. Quando tutto va bene, vedrete la risposta “Seeded data” sul vostro browser o sull’interfaccia di Postman. Quando provi a rifare il percorso, ti risponderà con “Table exists – Seeded data.”

Screenshot Of Our Seeded Data In A Table

Screenshot Of Our Seeded Data In A Table

Querying, inserting and removing data

Fetching all data

Knex rende le query molto semplici. Sto per scrivere un servizio che può recuperare, aggiornare, cancellare e creare utenti. Con Knex, l’interrogazione dei dati dal database Postgres è semplice come:

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

Creerò una rotta get per recuperare tutti gli utenti dal database. Quando questo endpoint viene pingato da Postman, Knex costruisce la query per i dati che stiamo richiedendo e restituisce i dati.

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

Inserimento dei dati

Anche l’inserimento di un nuovo utente nel database è semplice. Creerò un metodo .post alla rotta che abbiamo già creato e aggiornerò il usersService.js con una query per inserire i dati nel database pg.

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

La rotta aggiornata assomiglia a:

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); }); });

Aggiornamento, cancellazione e recupero di dati particolari

Raggrupperò insieme le rotte di aggiornamento, cancellazione e recupero per ID utente.

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 ricerca di informazioni specifiche da Knex è abbastanza semplice. In questo esempio, stiamo usando una combinazione di select, update e delete con una clausola where per scegliere gli utenti per ID e per modificare le loro informazioni. Il usersService.js assomiglia a:

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;

Seguendo il percorso GET, PATCH, o DELETE con l’ID utente appropriato, saremo in grado di vedere, modificare o cancellare le informazioni dell’utente dal database.

La versione completa di usersService.js e i percorsi sono spinti in questo repository su GitHub.

Pro e contro di Knex.js

Pro:
  1. Ci aiuta a scrivere meno query SQL: Knex sa a quale sistema di database ti stai connettendo e cambierà l’SQL che scrive per farlo corrispondere
  2. Sembra più simile alla programmazione con JavaScript
  3. Migrazioni e semina sono molto più semplici
Cons:
  1. Devi ancora prendere tempo per imparare le manipolazioni del db ad un livello più profondo
  2. Knex richiede una curva di apprendimento. È una libreria in sé, e lo sviluppatore dovrebbe conoscere a fondo la propria strada per usare Knex
  3. Se sei un principiante che cerca di costruire API, è meglio scegliere la strada difficile che quella felice. Scrivere le query da soli ti renderà più abile e comodo con i database che usare un costruttore di query come Knex

Stai aggiungendo nuove librerie JS per migliorare le prestazioni o costruire nuove funzionalità? E se stessero facendo il contrario?

Non c’è dubbio che i frontend stanno diventando più complessi. Man mano che aggiungete nuove librerie JavaScript e altre dipendenze alla vostra app, avrete bisogno di più visibilità per assicurarvi che i vostri utenti non incorrano in problemi sconosciuti.

LogRocket è una soluzione di monitoraggio delle applicazioni frontend che vi permette di riprodurre gli errori JavaScript come se fossero accaduti nel vostro browser in modo da poter reagire ai bug in modo più efficace.

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

LogRocket funziona perfettamente con qualsiasi app, indipendentemente dal framework, e ha plugin per registrare il contesto aggiuntivo da Redux, Vuex e @ngrx/store. Invece di indovinare perché i problemi accadono, è possibile aggregare e segnalare in quale stato si trovava la vostra applicazione quando si è verificato un problema. LogRocket monitora anche le prestazioni della tua applicazione, riportando metriche come il carico della CPU del client, l’utilizzo della memoria del client, e altro ancora.

Costruisci con fiducia – Inizia a monitorare gratuitamente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.