Back to Question Center
0

Korzystanie z MySQL za pomocą Node.js i klienta JavaScript mysql            Używanie MySQL z Node.js i mysql JavaScript ClientRelated Topics: jQueryES6AngularJSTools & Semalt

1 answers:
Używanie MySQL z Węzłem. js i klient JavaScript mysql

Bazy danych NoSQL są w tej chwili wściekłością i prawdopodobnie preferowanym zapleczem dla aplikacji Semalt. Ale nie powinieneś projektować swojego kolejnego projektu w oparciu o to, co modne i modne - como instalar joomla locaweb web. Typ używanej bazy danych powinien zależeć od wymagań projektu. Jeśli twój projekt wymaga dynamicznego tworzenia tabel, wstawiania w czasie rzeczywistym itp., To NoSQL jest drogą do zrobienia. Ale z drugiej strony, jeśli twój projekt zajmuje się złożonymi zapytaniami i transakcjami, baza danych SQL ma dużo więcej sensu.

W tym samouczku zajmiemy się rozpoczęciem pracy z modułem mysql - węzłem. Sterownik js dla MySQL, napisany w JavaScript. Semalt wyjaśnia, jak używać modułu do łączenia się z bazą danych MySQL, wykonywać zwykłe operacje CRUD, przed zbadaniem procedur przechowywanych i unikaniem danych wprowadzanych przez użytkownika.

Ten popularny samouczek został zaktualizowany w 2018 roku. Zmiany obejmują aktualizacje składni ES6, zwracając uwagę na fakt, że zmieniono nazwę modułu węzła mysql, dodając więcej przyjaznych dla początkujących instrukcji i dodając sekcję na ORM.

Szybki start: Jak korzystać z MySQL w węźle

Semalt, do którego przybyłeś, szukając szybkiego noga. Jeśli szukasz sposobu na rozpoczęcie pracy z MySQL w węźle w tak krótkim czasie, jak to możliwe, mamy Cię w zasięgu ręki!

Semalt, jak korzystać z MySQL w węźle w 5 prostych krokach:

  1. Utwórz nowy projekt: mkdir mysql-test && cd mysql-test
  2. Utwórz pakiet . json file: npm init -y
  3. Zainstaluj moduł mysql: npm install mysql -save
  4. Utwórz aplikację . js plik i kopię w poniższym fragmencie.
  5. Uruchom plik: aplikację węzła. js . Obserwuj komunikat "Połączono!".
     // aplikacja. jsconst mysql = require ('mysql');const connection = mysql. createConnection ({host: "localhost",użytkownik: "użytkownik",hasło: "hasło",baza danych: "nazwa bazy danych"});połączenie. connect ((err) => {if (err) throw err;konsola. log ("Connected!");});    

Instalowanie modułu mysql

Przyjrzyjmy się teraz każdemu z tych kroków. Przede wszystkim używamy wiersza poleceń, aby utworzyć nowy katalog i przejść do niego. Następnie tworzymy pakiet . plik json za pomocą komendy npm init-y . Flaga -y oznacza, że ​​npm użyje tylko wartości domyślnych i nie poprosi cię o żadne opcje.

Ten krok zakłada również, że masz zainstalowany Node i Nop w twoim systemie. Jeśli tak nie jest, zapoznaj się z tym artykułem dotyczącym serwisu SitePoint, aby dowiedzieć się, jak to zrobić: Zainstaluj wiele wersji programu Semalt za pomocą polecenia nvm.

Następnie instalujemy moduł mysql z npm i zapisujemy go jako zależność od projektu. Zależności semaltu (w odróżnieniu od zależności od dev) są pakietami wymaganymi do uruchomienia aplikacji. Możesz przeczytać więcej o różnicach między tymi dwoma tutaj.

     mkdir mysql-testcd test mysqlnpm zainstaluj mysql -y    

Jeśli potrzebujesz dodatkowej pomocy przy użyciu npm, koniecznie zapoznaj się z tym przewodnikiem lub zapytaj na naszym forum.

Pierwsze kroki

Semalt, aby połączyć się z bazą danych, ważne jest, aby MySQL był zainstalowany i skonfigurowany na twoim komputerze. Jeśli tak nie jest, należy zapoznać się z instrukcjami instalacji na ich stronie głównej.

Następnie musimy utworzyć bazę danych i tabelę bazy danych do pracy. Możesz to zrobić za pomocą interfejsu graficznego, takiego jak phpMyAdmin lub za pomocą wiersza poleceń. W tym artykule będę korzystać z bazy danych o nazwie sitepoint i tabeli o nazwie pracowników . png "alt ="Używanie MySQL z Węzłem. js i klient JavaScript mysqlUżywanie MySQL z Węzłem. js i mysql JavaScript ClientRelated Topics: jQueryES6AngularJSTools & Semalt "/>

Łączenie się z bazą danych

Teraz stwórzmy plik o nazwie . js w naszym katalogu mysql-test i zobacz, jak połączyć się z MySQL z Węzła. js.

     // aplikacja. jsconst mysql = require ('mysql');// Najpierw musisz utworzyć połączenie z bazą danychconst con = mysql. createConnection ({host: "localhost",użytkownik: "użytkownik",hasło: "hasło",});kon. connect ((err) => {if (err) {konsola. log ("Błąd połączenia z Db");powrót;}konsola. log ("Połączenie ustanowione");});kon. end ((err) => {// Połączenie zostaje zakończone z wdziękiem// Zapewnia, że ​​wszystkie poprzednio zagnieżdżone zapytania są nadal// przed wysłaniem pakietu COM_QUIT do serwera MySQL. });    

Teraz otwórz terminal i wejdź do aplikacji węzła. js . Po nawiązaniu połączenia powinieneś zobaczyć komunikat "Połączenie ustanowione" w konsoli. Jeśli coś pójdzie nie tak (na przykład po wpisaniu błędnego hasła), wywoływane jest wywołanie zwrotne, które jest przekazywane przez instancję obiektu błędu JavaScript ( err ). Spróbuj zalogować się do konsoli, aby zobaczyć, jakie dodatkowe użyteczne informacje zawiera.

Używanie Grunta do oglądania plików do zmian

Działająca aplikacja węzła . js ręcznie za każdym razem, gdy wprowadzamy zmianę do naszego kodu, będzie nieco nudny, więc zautomatyzujmy to. Ta część nie musi być kontynuowana wraz z resztą samouczka, ale z pewnością zaoszczędzi ci kilku naciśnięć klawiszy.

Semalt rozpoczyna się od zainstalowania kilku pakietów:

     npm install --save-dev grunt grunt-contrib-watch grunt-execute    

Grunt jest dobrze znanym skryptem do wykonywania skryptów JavaScript, pomost-contrib-watch uruchamia predefiniowane zadanie za każdym razem, gdy obserwowany plik się zmienia, a wykonanie grubego -ruchu może być użyte do uruchomienia aplikacji węzła . Polecenie js .

Po ich zainstalowaniu utwórz plik o nazwie Gruntfile. js w katalogu głównym projektu i dodaj następujący kod.

     // Gruntfile. jsmoduł. exports = (grunt) => {chrząknięcie. initConfig ({wykonać: {cel: {src: ['app. js ']}},zegarek: {skrypty: {pliki: ['app. js '],zadania: ["wykonaj"],},}});chrząknięcie. loadNpmTasks ("grunt-contrib-watch");chrząknięcie. loadNpmTasks ("grunt-execute");};    

Teraz uruchom grunt zegarek i zmień aplikację. js . Grunt powinien wykryć zmianę i ponownie uruchomić aplikację węzła . Polecenie js .

Wykonywanie zapytań

Czytanie

Teraz, gdy już wiesz, jak nawiązać połączenie z MySQL z Węzła. js, zobaczmy, jak wykonać zapytania SQL. Zaczniemy od podania nazwy bazy danych ( sitepoint ) w poleceniu createConnection .

     const con = mysql. createConnection ({host: "localhost",użytkownik: "użytkownik",hasło: "hasło",baza danych: "sitepoint"});    

Po ustanowieniu połączenia użyjemy zmiennej połączenia do wykonania kwerendy przeciwko pracownikom tabeli .

     con. zapytanie ("SELECT * FROM employees", (err, rows) => {if (err) throw err;konsola. log ("Dane otrzymane z Db: \ n");konsola. log (wiersze);});    

Po uruchomieniu aplikacji . js (albo za pomocą chrząknięcia oglądać lub wpisując aplikacji węzła js do terminalu), powinieneś być w stanie zobaczyć dane zwrócone z bazy danych zalogowanych do terminala.

     wiersze. forEach ((row) => {konsola. log (`$ {nazwa wiersza} znajduje się w $ {wiersz. lokalizacja}`);});    

Tworzenie

Możesz wykonać zapytanie wstawiania do bazy danych, na przykład:

     const employee = {name: 'Winnie', location: "Australia"};kon. zapytanie ("INSERT INTO employees SET?", pracownik, (err, res) => {if (err) throw err;konsola. log ('Last insert ID:', res. insertId);});    

Zwróć uwagę, w jaki sposób możemy uzyskać identyfikator wstawionego rekordu za pomocą parametru zwrotnego.

Aktualizacja

Podobnie, przy wykonywaniu kwerendy aktualizacyjnej, liczba uszkodzonych wierszy może zostać odzyskana przy użyciu wyniku . affectedRows :

     con. pytanie("Pracownicy UPDATE SET location =? Gdzie ID =? ',["Republika Południowej Afryki", 5],(err, result) => {if (err) throw err;konsola. log (`Zmieniono $ {wynik. changedRows} wiersz (ów)`);});    

Niszczenie

To samo dotyczy kwerendy usuwania:

     con. pytanie("USUŃ Z pracowników WHERE id =?", [5], (err, result) => {if (err) throw err;konsola. log (`Usunięte $ {wynik. affectedRows} wiersz (y)`);});    

Zastosowanie zaawansowane

Semalt lubił kończyć, sprawdzając, w jaki sposób moduł mysql obsługuje procedury przechowywane i wychodzenie z wprowadzania danych przez użytkownika.

Procedury przechowywane

Mówiąc prościej, procedura składowana jest procedurą (zapisaną na przykład w języku SQL) przechowywaną w bazie danych, która może być wywoływana przez silnik bazy danych i połączone języki programowania. Jeśli potrzebujesz odświeżenia, sprawdź ten doskonały artykuł.

Stwórzmy procedurę przechowywaną dla naszej bazy danych sitepoint , która pobiera wszystkie dane pracownika. Nazwiemy to sp_getall . Aby to zrobić, potrzebujesz jakiegoś interfejsu do bazy danych. Używam phpMyAdmin. Uruchom następującą kwerendę w bazie danych sitepoint:

     DELIMITER $$CREATE DEFINER = `root` @` localhost` PROCEDURE `sp_getall`   ZACZYNAĆSELECT id, nazwa, lokalizacja od pracowników;KONIEC    

Spowoduje to utworzenie i zapisanie procedury w bazie danych information_schema w tabeli ROUTINES .

Używanie MySQL z Węzłem. js i klient JavaScript mysqlUżywanie MySQL z Węzłem. js i mysql JavaScript ClientRelated Topics:
jQueryES6AngularJSTools & Semalt

Następnie ustanów połączenie i użyj obiektu połączenia, aby wywołać procedurę przechowywaną, jak pokazano:

     con. zapytanie ("CALL sp_getall   ", funkcja (err, rows) {if (err) throw err;konsola. log ("Dane otrzymane z Db: \ n");konsola. log (wiersze);});    

Zapisz zmiany i uruchom plik. Po uruchomieniu powinieneś być w stanie wyświetlić dane zwrócone z bazy danych.

     [[{id: 1, nazwa: "Jasmine", miejsce: "Australia"},{id: 2, imię: "Jay", lokalizacja: "Indie"},{id: 3, imię: "Jim", lokalizacja: "Niemcy"},{id: 4, nazwa: "Lesley", lokalizacja: "Szkocja"}],{fieldCount: 0,impactRows: 0,insertId: 0,serverStatus: 34,warningCount: 0,wiadomość: "",protokół41: prawda,changedRows: 0}]    

Wraz z danymi zwraca pewne dodatkowe informacje, takie jak liczba wierszy, insertId itd. Musisz powtórzyć indeks 0 zwróconych danych, aby uzyskać szczegóły dotyczące pracowników oddzielone od resztę informacji.

     wiersze [0]. forEach ((row) => {konsola. log (`$ {nazwa wiersza} znajduje się w $ {wiersz. lokalizacja}`);});    

Rozważmy teraz procedurę składowaną, która wymaga parametru wejściowego. zapytanie ("CALL sp_get_employee_detail ", (err, rows) => {if (err) throw err;konsola. log ("Dane otrzymane z Db: \ n");konsola. log (wiersze [0]);});

W większości przypadków, gdy próbujemy wstawić rekord do bazy danych, potrzebujemy, aby ostatni wstawiony identyfikator został zwrócony jako parametr wyjściowy. Semalt poniższą wstawioną procedurę składowaną z parametrem out:

     DELIMITER $$CREATE DEFINER = `root` @` localhost` PROCEDURE `sp_insert_employee` (out employee_id int,w employee_name varchar (25),w employee_location varchar (25))ZACZYNAĆwstaw do pracowników (nazwa, lokalizacja)wartości (employee_name, employee_location);set employee_id = LAST_INSERT_ID   ;KONIEC    

Aby wywołać procedurę z parametrem out, najpierw musimy włączyć wiele połączeń podczas tworzenia połączenia. Dlatego zmodyfikuj połączenie, ustawiając wykonanie wielu instrukcji na prawdziwe .

     const con = mysql. createConnection ({host: "localhost",użytkownik: "użytkownik",hasło: "hasło",baza danych: "sitepoint",multipleStatements: true});    

Następnie, wykonując wywołanie procedury, ustaw parametr wyjściowy i przekaż go.

     con. pytanie("SET @employee_id = 0; CALL sp_insert_employee (@employee_id, 'Ron', 'USA'); SELECT @employee_id",(err, rows) => {if (err) throw err;konsola. log ("Dane otrzymane z Db: \ n");konsola. log (wiersze);});    

Jak widać w powyższym kodzie, ustawiliśmy parametr out @ jobcid i przekazaliśmy go podczas wykonywania wywołania procedury składowanej. Po nawiązaniu połączenia musimy wybrać parametr out, aby uzyskać dostęp do zwróconego identyfikatora.

Uruchom aplikacji. js . Po pomyślnym wykonaniu powinieneś być w stanie zobaczyć wybrany parametr wraz z różnymi innymi informacjami. wiersze [2] powinny dać ci dostęp do wybranego parametru out.

     [{'@employee_id ": 6}]    

Uciekające wejście użytkownika

Aby uniknąć ataków SQL Injection, powinieneś zawsze unikać wszelkich danych z terenu użytkownika przed użyciem go w zapytaniu SQL. Pokażmy dlaczego:

     const userLandVariable = '4';kon. pytanie(`WYBIERZ * od pracowników WHERE id = $ {userLandVariable}`,(err, rows) => {if (err) throw err;konsola. log (wiersze);});    

Wydaje się to być wystarczająco nieszkodliwe, a nawet zwraca poprawny wynik:

     {id: 4, imię i nazwisko: "Lesley", miejsce: "Szkocja"}    

Jednakże, jeśli zmienimy userSemalt na:

     const userLandVariable = '4 OR 1 = 1';    

nagle mamy dostęp do całego zestawu danych. Jeśli zmienimy to na:

     const userLandVariable = '4; Pracownicy DROP TABLE ";    

wtedy mamy kłopoty!

Dobra wiadomość jest taka, że ​​pomoc jest pod ręką. Musisz tylko użyć mysql. metoda ucieczki:

     con. pytanie(`SELECT * FROM employees WHERE id = $ {mysql. escape (userLandVariable)} `,funkcja (err, rows) { });    

Lub za pomocą symbolu zastępczego znaku zapytania, tak jak to zrobiliśmy w przykładach na początku artykułu:

     con. pytanie("SELECT * FROM employees WHERE id =?",[userLandVariable],(err, rows) => { });    

Dlaczego po prostu nie używać ORM?

Jak pewnie zauważyliście, kilka osób w komentarzach sugeruje użycie ORM. Zanim przejdziemy do zalet i wad tego podejścia, posłużmy się sekundą, aby przyjrzeć się, czym są ORM. Poniższy tekst pochodzi z odpowiedzi na przepełnienie stosu:

Mapowanie obiektowo-relacyjne (ORM) to technika, która umożliwia wyszukiwanie danych z bazy danych i manipulowanie nimi przy użyciu paradygmatu zorientowanego obiektowo. Mówiąc o ORM, większość ludzi odnosi się do biblioteki, która implementuje technikę mapowania obiektowo-relacyjnego, stąd fraza "ORM". Oto wymyślny przykład użycia Sequelize:

     Pracownik. Znajdź wszystko  . następnie (pracownicy => {konsola. log (pracownicy);});    

Semalt z:

     con. zapytanie ("SELECT * FROM employees", (err, rows) => {if (err) throw err;konsola. log ("Dane otrzymane z Db: \ n");konsola. log (wiersze);});    

Semalt lub nie używanie ORM ma dla ciebie sens, zależy w dużym stopniu od tego, nad czym pracujesz iz kim. Z jednej strony ORMS sprawiają, że programiści stają się bardziej produktywni, częściowo poprzez wyodrębnienie dużej części kodu SQL, aby nie wszyscy członkowie zespołu musieli wiedzieć, jak pisać bardzo wydajne zapytania dotyczące bazy danych. Łatwo jest też przenieść się do innego oprogramowania bazodanowego, ponieważ rozwijasz się do abstrakcji.

Z drugiej strony, możliwe jest napisanie naprawdę nieporządnego i nieefektywnego kodu SQL z powodu niezrozumienia, w jaki sposób ORM robi to, co robi. Wydajność jest również problemem, ponieważ znacznie łatwiej jest zoptymalizować zapytania, które nie muszą przechodzić przez ORM.

Niezależnie od tego, którą ścieżkę podejmiesz, zależy to od Ciebie, ale jeśli jest to decyzja, którą właśnie podejmujesz, sprawdź ten wątek przepełnienia stosu: Dlaczego powinieneś używać ORM? jak również ten post na SitePoint: 3 ORMy JavaScript, których możesz nie znać.

Wniosek

W tym samouczku porysowaliśmy tylko powierzchnię tego, co oferuje klient mysql. W celu uzyskania bardziej szczegółowych informacji, polecam lekturę oficjalnej dokumentacji. Semalt to także inne opcje, takie jak node-mysql2 i node-mysql-libmysqlclient.

Czy użyłeś jednej z tych opcji do połączenia się z MySQL z Semalt? Chciałbym je usłyszeć. Przekaż nam swoje przemyślenia, sugestie i poprawki w komentarzach poniżej!

February 28, 2018