Zephyrnet Logosu

MySQL'i Node.js ve mysql JavaScript İstemcisi ile kullanma

Tarih:

NoSQL veritabanları, Nogo geliştiricileri arasında oldukça popülerdir ve MongoDB (MEAN yığınındaki “M”) pakete öncülük eder. Ancak, yeni bir Düğüm projesi başlatırken, Mongo'yu yalnızca varsayılan seçenek olarak kabul etmemelisiniz. Bunun yerine, seçtiğiniz veritabanı türü projenizin gereksinimlerine bağlı olmalıdır. Örneğin, dinamik tablo oluşturmaya veya gerçek zamanlı eklere ihtiyacınız varsa, NoSQL çözümü gitmenin yoludur. Projeniz karmaşık sorgular ve işlemler ile ilgileniyorsa, bir SQL veritabanı çok daha mantıklıdır.

Bu derste, aşağıdakileri yapmaya başlayacağız: mysql modülü - JavaScript ile yazılmış MySQL için bir Node.js istemcisi. Bir MySQL veritabanına bağlanmak ve normal CRUD işlemlerini gerçekleştirmek için modülün nasıl saklanacağını, saklı yordamlara bakmadan ve kullanıcı girişinden kaçmayı açıklayacağım.

Bu popüler makale, Node.js ile MySQL kullanımıyla ilgili mevcut uygulamaları yansıtacak şekilde 2020'de güncellenmiştir. MySQL hakkında daha fazla bilgi için okuyun Hızlı Başlangıç ​​MySQL.

Hızlı Başlangıç: Düğümde MySQL Nasıl Kullanılır

Buraya Node'de MySQL ile çalışmaya başlamanın hızlı bir yolunu aradıysanız, sizi ele geçirdik!

Düğümde MySQL'i beş kolay adımda nasıl kullanacağınız aşağıda açıklanmıştır:

  1. Yeni bir proje oluşturun: mkdir mysql-test && cd mysql-test.
  2. Hat için bir package.json Dosya: npm init -y.
  3. Mysql modülünü takın: npm install mysql.
  4. Bir oluşturma app.js aşağıdaki snippet'te dosya ve kopyalayın (yer tutucuları gerektiği gibi düzenleyerek).
  5. Dosyayı çalıştırın: node app.js. Bir "Bağlı!" İleti.
const mysql = require('mysql');
const connection = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'database name'
});
connection.connect((err) => { if (err) throw err; console.log('Connected!');
});

Mysql Modülünü Takma

Şimdi bu adımların her birine daha yakından bakalım.

mkdir mysql-test
cd mysql-test
npm init -y
npm install mysql

Her şeyden önce yeni bir dizin oluşturmak ve bu dizine gitmek için komut satırını kullanıyoruz. Sonra bir package.json komutu kullanarak dosya npm init -y. -y flag, npm'nin etkileşimli bir işlem gerçekleştirmeden varsayılanları kullanacağı anlamına gelir.

Bu adım ayrıca sisteminizde Düğüm ve npm yüklü olduğunu varsayar. Bu durumda, nasıl yapılacağını öğrenmek için bu SitePoint makalesine göz atın: Nvm kullanarak Birden Çok Node.js Sürümünü Yükleme.

Bundan sonra, mysql modülü ve proje bağımlılığı olarak kaydediliyor. Proje bağımlılıkları (devDependencies yerine) uygulamanın çalışması için gereken paketlerdir. Okuyabilirsin burada ikisi arasındaki farklar hakkında daha fazla bilgi.

Npm kullanımıyla ilgili daha fazla yardıma ihtiyacınız varsa, kontrol ettiğinizden emin olun. Bu kılavuzuveya sor forumlarımız.

Başlamak

Bir veritabanına bağlanmaya başlamadan önce, makinenizde MySQL'in kurulu ve yapılandırılmış olması önemlidir. Aksi takdirde, lütfen ana sayfalarına kurulum talimatları.

Yapmamız gereken bir sonraki şey, çalışmak için bir veritabanı ve bir veritabanı tablosu oluşturmaktır. Bunu kullanarak bir
gibi grafiksel arayüz yönetimveya komut satırını kullanarak. Bu makale için şu veritabanını kullanacağım: sitepoint ve masa denen authors. İşte veritabanının bir dökümü, böylece takip etmek isterseniz hızlı bir şekilde çalışmaya başlayabilirsiniz:

CREATE DATABASE sitepoint CHARACTER SET utf8 COLLATE utf8_general_ci;
USE sitepoint; CREATE TABLE authors ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50), city varchar(50), PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; INSERT IGNORE INTO authors (id, name, city) VALUES
(1, 'Michaela Lehr', 'Berlin'),
(2, 'Michael Wanyoike', 'Nairobi'),
(3, 'James Hibbard', 'Munich'),
(4, 'Karolina Gawron', 'Wrocław');

MySQL'i Node.js ve mysql JavaScript İstemcisi ile kullanma

Veritabanına Bağlanma

Şimdi şu adlı bir dosya oluşturalım: app.js bizimkinde mysql-test dizinine gidin ve Node.js'den MySQL'e nasıl bağlanacağınızı görün.

const mysql = require('mysql'); // First you need to create a connection to the database
// Be sure to replace 'user' and 'password' with the correct values
const con = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password',
}); con.connect((err) => { if(err){ console.log('Error connecting to Db'); return; } console.log('Connection established');
}); con.end((err) => { // The connection is terminated gracefully // Ensures all remaining queries are executed // Then sends a quit packet to the MySQL server.
});

Şimdi bir terminal açın ve girin node app.js. Bağlantı başarıyla kurulduktan sonra konsolda “Bağlantı kuruldu” mesajını görebilmeniz gerekir. Bir şeyler ters giderse (örneğin, yanlış şifre girerseniz), JavaScript Hatası nesnesinin (err). Hangi ek yararlı bilgileri içerdiğini görmek için bunu konsola kaydetmeyi deneyin.

Değişiklikler için Dosyaları İzlemek için nodemon kullanma

Koşu node app.js Kodumuzda her değişiklik yaptığımızda biraz sıkıcı olacak, bu yüzden bunu otomatikleştirelim. Bu bölüm, eğitimin geri kalanıyla birlikte takip etmek zorunda değildir, ancak kesinlikle bazı tuş vuruşlarını kurtaracaktır.

Bir yükleyerek başlayalım. düğüm paketlemek. Bu, bir dizindeki dosya değişiklikleri algılandığında bir Düğüm uygulamasını otomatik olarak yeniden başlatan bir araçtır:

npm install --save-dev nodemon

Şimdi koş ./node_modules/.bin/nodemon app.js ve üzerinde değişiklik yap app.js. nodemon değişikliği algılamalı ve uygulamayı yeniden başlatmalıdır.

Not: Nodemon'u doğrudan node_modules Klasör. Ayrıca global olarak yükleyebilir veya başlatmak için bir npm betiği oluşturabilirsiniz.

Sorguları Yürütme

Okuma

Artık Node.js'den bir MySQL veritabanına nasıl bağlantı kuracağınızı bildiğinize göre, SQL sorgularının nasıl yürütüleceğini görelim. Veritabanı adını (sitepointOlarak) createConnection komut:

const con = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'sitepoint'
});

Bağlantı kurulduktan sonra, con veritabanı tablosunda sorgu yürütmek için değişken authors:

con.query('SELECT * FROM authors', (err,rows) => { if(err) throw err; console.log('Data received from Db:'); console.log(rows);
});

Koştuğunda app.js (nodemon kullanarak veya yazarak node app.js terminalinize girerseniz), terminale kaydedilen veritabanından döndürülen verileri görebilmeniz gerekir:

[ RowDataPacket { id: 1, name: 'Michaela Lehr', city: 'Berlin' }, RowDataPacket { id: 2, name: 'Michael Wanyoike', city: 'Nairobi' }, RowDataPacket { id: 3, name: 'James Hibbard', city: 'Munich' }, RowDataPacket { id: 4, name: 'Karolina Gawron', city: 'Wrocław' } ]

MySQL veritabanından döndürülen veriler, yalnızca rows nesne.

rows.forEach( (row) => { console.log(`${row.name} lives in ${row.city}`);
});

Bu size aşağıdakileri verir:

Michaela Lehr lives in Berlin
Michael Wanyoike lives in Nairobi
James Hibbard lives in Munich
Karolina Gawron lives in Wrocław

Oluşturma

Bir veritabanına karşı bir ekleme sorgusu yürütebilirsiniz, şöyle:

const author = { name: 'Craig Buckler', city: 'Exmouth' };
con.query('INSERT IGNORE INTO authors SET ?', author, (err, res) => { if(err) throw err; console.log('Last insert ID:', res.insertId);
});

Geri arama parametresini kullanarak eklenen kaydın kimliğini nasıl alabileceğimizi unutmayın.

Güncellenmesi

Benzer şekilde, bir güncelleme sorgusu yürütülürken, etkilenen satır sayısı kullanılarak result.affectedRows:

con.query( 'UPDATE authors SET city = ? Where ID = ?', ['Leipzig', 3], (err, result) => { if (err) throw err; console.log(`Changed ${result.changedRows} row(s)`); }
);

tahrip

Aynı şey silme sorgusu için de geçerlidir:

con.query( 'DELETE FROM authors WHERE id = ?', [5], (err, result) => { if (err) throw err; console.log(`Deleted ${result.affectedRows} row(s)`); }
);

Gelişmiş Kullanım

Mysql modülünün saklı yordamları nasıl ele aldığını ve kullanıcı girişinin kaçışını inceleyerek bitirmek istiyorum.

Saklı Prosedürler

Basitçe söylemek gerekirse, bir saklı yordam kolayca yeniden kullanılabilmesi için bir veritabanına kaydedebilirsiniz SQL kodu hazırlanır. Saklı yordamlar hakkında bilgi tazeleme ihtiyacı duyuyorsanız, Bu eğitimde.

Bizim için saklı bir prosedür oluşturalım sitepoint tüm yazar bilgilerini alan veritabanı. Biz arayacağız sp_get_authors. Bunu yapmak için, veritabanına bir çeşit arabirime ihtiyacınız olacaktır. kullanıyorum yönetim. Aşağıdaki sorguyu sitepoint veritabanını kullanarak kullanıcının MySQL sunucusunda yönetici haklarına sahip olmasını sağlar:

DELIMITER $$ CREATE PROCEDURE `sp_get_authors`()
BEGIN SELECT id, name, city FROM authors;
END $$

Bu işlem prosedürü oluşturur ve information_schema veritabanında ROUTINES tablo.

Yönetici'de saklı yordam oluşturma

Not: Sınırlayıcı sözdizimi size garip geliyorsa, açıklanır okuyun.

Ardından, bir bağlantı kurun ve saklanan yordamı gösterildiği gibi çağırmak için bağlantı nesnesini kullanın:

con.query('CALL sp_get_authors()',function(err, rows){ if (err) throw err; console.log('Data received from Db:'); console.log(rows);
});

Değişiklikleri kaydedin ve dosyayı çalıştırın. Yürütüldükten sonra, veritabanından döndürülen verileri görebilmeniz gerekir:

[ [ RowDataPacket { id: 1, name: 'Michaela Lehr', city: 'Berlin' }, RowDataPacket { id: 2, name: 'Michael Wanyoike', city: 'Nairobi' }, RowDataPacket { id: 3, name: 'James Hibbard', city: 'Leipzig' }, RowDataPacket { id: 4, name: 'Karolina Gawron', city: 'Wrocław' }, OkPacket { fieldCount: 0, affectedRows: 0, insertId: 0, serverStatus: 34, warningCount: 0, message: '', protocol41: true, changedRows: 0 } ]

Verilerle birlikte, etkilenen satır sayısı, insertId Çalışan ayrıntılarını bilgilerin geri kalanından ayırmak için, döndürülen verilerin 0. dizinini yinelemeniz gerekir:

rows[0].forEach( (row) => { console.log(`${row.name} lives in ${row.city}`);
});

Bu size aşağıdakileri verir:

Michaela Lehr lives in Berlin
Michael Wanyoike lives in Nairobi
James Hibbard lives in Leipzig
Karolina Gawron lives in Wrocław

Şimdi bir girdi parametresi gerektiren saklı bir prosedürü ele alalım:

DELIMITER $$ CREATE PROCEDURE `sp_get_author_details`( in author_id int
)
BEGIN SELECT name, city FROM authors where id = author_id;
END $$

Saklı yordama çağrı yaparken giriş parametresini iletebiliriz:

con.query('CALL sp_get_author_details(1)', (err, rows) => { if(err) throw err; console.log('Data received from Db:n'); console.log(rows[0]);
});

Bu size aşağıdakileri verir:

[ RowDataPacket { name: 'Michaela Lehr', city: 'Berlin' } ]

Çoğu zaman veritabanına bir kayıt eklemeye çalıştığımızda, son eklenen kimliğin bir çıkış parametresi olarak döndürülmesi gerekir. Out parametresiyle aşağıdaki insert saklı yordamını düşünün:

DELIMITER $$ CREATE PROCEDURE `sp_insert_author`( out author_id int, in author_name varchar(25), in author_city varchar(25)
)
BEGIN insert into authors(name, city) values(author_name, author_city); set author_id = LAST_INSERT_ID();
END $$

Out parametresiyle bir prosedür çağrısı yapmak için, önce bağlantıyı oluştururken birden fazla çağrıyı etkinleştirmemiz gerekir. Bu nedenle, çoklu ifade yürütmesini şu şekilde ayarlayarak bağlantıyı değiştirin: true:

const con = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'sitepoint', multipleStatements: true
});

Ardından, prosedüre çağrı yaparken bir out parametresi ayarlayın ve iletin:

con.query( "SET @author_id = 0; CALL sp_insert_author(@author_id, 'Craig Buckler', 'Exmouth'); SELECT @author_id", (err, rows) => { if (err) throw err; console.log('Data received from Db:n'); console.log(rows); }
);

Yukarıdaki kodda görüldüğü gibi, @author_id out parametresini kullanın ve saklı yordama çağrı yaparken geçirin. Arama yapıldıktan sonra, döndürülen kimliğe erişmek için out parametresini seçmemiz gerekir.

koşmak app.js. Başarılı bir yürütmede, seçilen diğer parametreyi çeşitli diğer bilgilerle birlikte görebilmeniz gerekir. rows[2] seçilen çıkış parametresine erişmenizi sağlamalıdır:

 [ RowDataPacket { '@author_id': 6 } ] ]

Not: Saklı bir yordamı silmek için komutu çalıştırmanız gerekir DROP PROCEDURE <procedure-name>; oluşturduğunuz veritabanına karşı.

Kaçan Kullanıcı Girişi

SQL Injection saldırılarını önlemek için, her zaman SQL sorgusu içinde kullanmadan önce kullanıcılardan aldığınız verilerden kaçın. Nedenini gösterelim:

const userSubmittedVariable = '1'; con.query( `SELECT * FROM authors WHERE id = ${userSubmittedVariable}`, (err, rows) => { if(err) throw err; console.log(rows); }
);

Bu yeterince zararsız görünüyor ve hatta doğru sonucu döndürüyor:

 { id: 1, name: 'Michaela Lehr', city: 'Berlin' }

Ancak, userSubmittedVariable : bu

const userSubmittedVariable = '1 OR 1=1';

Aniden tüm veri setine erişimimiz var. Şimdi bunu şu şekilde değiştirin:

const userSubmittedVariable = '1; DROP TABLE authors';

Şimdi sorunumuz var!

İyi haber şu ki, yardım el altında. Sadece mysql.kaçış yöntem:

con.query( `SELECT * FROM authors WHERE id = ${mysql.escape(userSubmittedVariable)}`, (err, rows) => { if(err) throw err; console.log(rows); }
);

Ayrıca, makalenin başındaki örneklerde yaptığımız gibi bir soru işareti yer tutucusu da kullanabilirsiniz:

con.query( 'SELECT * FROM authors WHERE id = ?', [userSubmittedVariable], (err, rows) => { if(err) throw err; console.log(rows); }
);

Neden Sadece ORM KULLANMAYIN?

Bu yaklaşımın avantaj ve dezavantajlarına girmeden önce, ORM'lerin ne olduğuna bakmak için biraz zaman ayıralım. Aşağıdakilerden alınır Stack Overflow üzerine bir cevap:

Nesne İlişkisel Eşleme (ORM), nesne yönelimli bir paradigma kullanarak veritabanındaki verileri sorgulamanızı ve değiştirmenizi sağlayan bir tekniktir. ORM hakkında konuşurken, çoğu insan Nesne İlişkisel Haritalama tekniğini uygulayan bir kütüphaneye, dolayısıyla “bir ORM” ifadesine atıfta bulunmaktadır.

Bu, veritabanı mantığınızı, şimdiye kadar aldığımız vanilya yaklaşımının aksine, ORM'nin etki alanına özgü dilinde yazdığınız anlamına gelir. Bunun nasıl görünebileceği hakkında bir fikir vermek için, Özetlemek, tüm yazarlar için veritabanını sorgular ve bunları konsola kaydeder:

const sequelize = new Sequelize('sitepoint', 'user', 'password', { host: 'localhost', dialect: 'mysql'
}); const Author = sequelize.define('author', { name: { type: Sequelize.STRING, }, city: { type: Sequelize.STRING },
}, { timestamps: false
}); Author.findAll().then(authors => { console.log("All authors:", JSON.stringify(authors, null, 4));
});

Bir ORM kullanmanın sizin için anlamlı olup olmadığı, üzerinde çalıştığınız şeye ve kiminle çalıştığınıza çok bağlı olacaktır. Bir yandan, ORMS, ekipteki herkesin süper verimli veritabanına özgü sorguların nasıl yazılacağını bilmesine gerek kalmaması için SQL'in büyük bir kısmını soyutlayarak geliştiricileri daha verimli hale getirme eğilimindedir. Farklı bir veritabanı yazılımına geçmek de kolaydır, çünkü bir soyutlamaya doğru gelişiyorsunuz.

Öte yandan, ORM'nin yaptığı şeyi nasıl yaptığını anlamamasının bir sonucu olarak gerçekten dağınık ve verimsiz bir SQL yazmak mümkündür. Performans da ORM'den geçmesi gerekmeyen sorguları optimize etmenin çok daha kolay olması sorunudur.

Hangi yolu seçerseniz seçin, ancak bu karar verme aşamasındaysanız, şu Stack Overflow iş parçacığına bakın: Neden ORM kullanmalısınız?. SitePoint'teki bu gönderiye de göz atın: Bilmediğiniz 3 JavaScript ORM'si.

Sonuç

Bu öğreticide, mysql istemcisi Node.js için hazırlandı ve veritabanına bağlanacak şekilde yapılandırdı. Ayrıca, SQL enjeksiyon saldırılarını azaltmak için CRUD işlemlerinin nasıl gerçekleştirileceğini, hazırlanan ifadelerle nasıl çalışacağını ve kullanıcı girdisinden nasıl kaçacağını gördük. Ve yine de, sadece mysql istemcisinin sunduğu yüzeyi çizdik. Daha ayrıntılı bilgi için, resmi belgeler.

Ve unutmayın ki mysql modülü şehirdeki tek gösteri değildir. Popüler gibi başka seçenekler de var düğüm mysql2.

Kaynak: https://www.sitepoint.com/using-node-mysql-javascript-client/?utm_source=rss

spot_img

En Son İstihbarat

spot_img