Node.js
Integrazione con MySQL
Ricerca…
introduzione
In questo argomento imparerai come integrarsi con Node.js utilizzando lo strumento di gestione del database MYSQL. Imparerai vari modi per connetterti e interagire con i dati che risiedono in mysql usando un programma e uno script nodejs.
Interrogare un oggetto di connessione con parametri
Quando si desidera utilizzare il contenuto generato dall'utente in SQL, con i parametri. Ad esempio per cercare un utente con il nome aminadav
dovresti fare:
var username = 'aminadav';
var querystring = 'SELECT name, email from users where name = ?';
connection.query(querystring, [username], function(err, rows, fields) {
if (err) throw err;
if (rows.length) {
rows.forEach(function(row) {
console.log(row.name, 'email address is', row.email);
});
} else {
console.log('There were no results.');
}
});
Utilizzo di un pool di connessioni
un. Esecuzione di più query contemporaneamente
Tutte le query nella connessione MySQL vengono eseguite una dopo l'altra. Significa che se si desidera eseguire 10 query e ciascuna query richiede 2 secondi, saranno necessari 20 secondi per completare l'intera esecuzione. La soluzione è creare 10 connessioni ed eseguire ogni query in una connessione diversa. Questo può essere fatto automaticamente usando il pool di connessioni
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bobby',
password : 'pass',
database : 'schema'
});
for(var i=0;i<10;i++){
pool.query('SELECT ` as example', function(err, rows, fields) {
if (err) throw err;
console.log(rows[0].example); //Show 1
});
}
Eseguirà tutte le 10 query in parallelo.
Quando usi pool
non hai più bisogno della connessione. Puoi interrogare direttamente il pool. Il modulo MySQL cercherà la prossima connessione gratuita per eseguire la query.
b. Raggiungimento della multi-tenancy sul server di database con diversi database ospitati su di esso.
La multitenancy è un requisito comune delle applicazioni aziendali al giorno d'oggi e la creazione di un pool di connessioni per ogni database nel server di database non è consigliata. quindi, ciò che possiamo fare è creare un pool di connessioni con un server di database e quindi cambiarle tra i database ospitati su un server di database su richiesta.
Supponiamo che la nostra applicazione abbia diversi database per ogni azienda ospitata sul server di database. Ci collegheremo al rispettivo database aziendale quando l'utente raggiunge l'applicazione. Ecco l'esempio su come farlo: -
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bobby',
password : 'pass'
});
pool.getConnection(function(err, connection){
if(err){
return cb(err);
}
connection.changeUser({database : "firm1"});
connection.query("SELECT * from history", function(err, data){
connection.release();
cb(err, data);
});
});
Lasciatemi fare un esempio:
Durante la definizione della configurazione del pool non ho fornito il nome del database, ma ho fornito solo il server del database
{
connectionLimit : 10,
host : 'example.org',
user : 'bobby',
password : 'pass'
}
quindi, quando vogliamo utilizzare il database specifico sul server di database, chiediamo la connessione al database dei risultati utilizzando: -
connection.changeUser({database : "firm1"});
puoi consultare la documentazione ufficiale qui
Connetti a MySQL
Uno dei modi più semplici per connettersi a MySQL è usando il modulo mysql
. Questo modulo gestisce la connessione tra l'app Node.js e il server MySQL. Puoi installarlo come qualsiasi altro modulo:
npm install --save mysql
Ora devi creare una connessione mysql, che puoi in seguito interrogare.
const mysql = require('mysql');
const connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'database_schema'
});
connection.connect();
// Execute some query statements
// I.e. SELECT * FROM FOO
connection.end();
Nel prossimo esempio imparerai come interrogare l'oggetto di connection
.
Interrogare un oggetto di connessione senza parametri
Si invia la query come stringa e in risposta si riceve una risposta con la risposta. Il callback ti dà error
, array di rows
e campi. Ogni riga contiene tutta la colonna della tabella restituita. Ecco uno snippet per la seguente spiegazione.
connection.query('SELECT name,email from users', function(err, rows, fields) {
if (err) throw err;
console.log('There are:', rows.length,' users');
console.log('First user name is:',rows[0].name)
});
Esegui un numero di query con una singola connessione da un pool
Potrebbero esserci situazioni in cui hai impostato un pool di connessioni MySQL, ma hai un numero di query che vorresti eseguire in sequenza:
SELECT 1; SELECT 2;
Si potrebbe semplicemente eseguire quindi usando pool.query
come visto altrove , tuttavia se si dispone di una sola connessione libera nel pool, è necessario attendere fino a quando una connessione diventa disponibile prima di poter eseguire la seconda query.
Tuttavia, è possibile mantenere una connessione attiva dal pool ed eseguire tutte le query che si desidera utilizzando una singola connessione mediante pool.getConnection
:
pool.getConnection(function (err, conn) { if (err) return callback(err); conn.query('SELECT 1 AS seq', function (err, rows) { if (err) throw err; conn.query('SELECT 2 AS seq', function (err, rows) { if (err) throw err; conn.release(); callback(); }); }); });
Nota: è necessario ricordare di release
la connessione, altrimenti è disponibile una connessione MySQL in meno per il resto del pool!
Per ulteriori informazioni sul pooling delle connessioni MySQL, consultare i documenti MySQL .
Restituisce la query quando si verifica un errore
È possibile allegare la query eseguita all'oggetto err
quando si verifica un errore:
var q = mysql.query('SELECT `name` FROM `pokedex` WHERE `id` = ?', [ 25 ], function (err, result) { if (err) { // Table 'test.pokedex' doesn't exist err.query = q.sql; // SELECT `name` FROM `pokedex` WHERE `id` = 25 callback(err); } else { callback(null, result); } });
Esporta pool di connessioni
// db.js
const mysql = require('mysql');
const pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bob',
password : 'secret',
database : 'my_db'
});
module.export = {
getConnection: (callback) => {
return pool.getConnection(callback);
}
}
// app.js
const db = require('./db');
db.getConnection((err, conn) => {
conn.query('SELECT something from sometable', (error, results, fields) => {
// get the results
conn.release();
});
});