JavaScript >> Javascript 文檔 >  >> Node.js

將 MySQL 與 Node.js 應用程序集成

簡介

MySQL 是一種非常流行的關係數據庫管理系統 (RDBMS) - 長期以來一直是任何後端工程師工具包中的主要內容,就在 PostgreSQL 旁邊。

隨著用於後端的 JavaScript 的出現,以及 Node.js 的流行度和適用性的驚人增長——MySQL 通常被用作使用 Node 構建的項目和應用程序的數據庫。

注意: 在整個指南中,我們將參考 npm MySQL 驅動程序為 mysql ,以及 MySQL 數據庫本身作為 MySQL .

MySQL 設置

要使用 MySQL - 您需要下載 MySQL 數據庫 並在您的本地計算機上託管一個小型服務器。社區版完全免費!

您還可以選擇安裝支持 MySQL 數據庫 (Xampp , ) - 它們也適用於 Node 的 MySQL 驅動程序。

安裝程序很簡單,一旦你設置了一個服務實例,你就可以創建一個項目來連接它!

用於節點項目的 MySQL 驅動程序

假設服務器正在運行,您可以使用驅動程序通過 Node 應用程序以編程方式與它通信。要使應用程序具有此功能,您需要安裝 MySQL 驅動程序 . npm 上提供驅動程序 作為 mysql

首先,讓我們創建一個新目錄來託管我們的應用程序並使用默認設置初始化一個新的 Node 項目:

$ mkdir mysql-app
$ cd mysql-app
$ npm init -y

這將生成一個新的 package.json 其中包含我們項目的基本元數據。完成後,我們可以通過 npm 安裝 node MySQL 驅動程序包 :

$ npm install mysql

我們可以通過檢查我們的 package.json 來驗證安裝是否成功 文件,我們應該在其中找到 mysql 的新條目 在dependencies下添加 :

 ...
 "dependencies": {
    "mysql": "^2.18.1"
  }

注意: ^2.18.1 代表版本號,這會根據你安裝的 MySQL 的版本而有所不同。

建立連接

可以通過createConnection()創建連接對象 mysql的功能 實例。然後可以使用此對像在服務器和客戶端/驅動程序之間創建連接!它接受三個參數:

  • 主機 - host 您的數據庫。默認值為 'localhost' .
  • 用戶 - 授權數據庫管理員的用戶名。默認值為 'root' .
  • 密碼 - 授權數據庫管理員的密碼。默認值為空字符串(無密碼)。
  • 數據庫 - 一個可選參數,定義您要修改的數據庫名稱。

考慮到這些,讓我們打開默認的 index.js 文件 - 我們可以通過以下方式連接到 MySQL 服務器:

var mysql = require("mysql");

var connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "",
});

connection.connect((err) => {
    if (err) {
      console.log("Error occurred", err);
    } else {
      console.log("Connected to MySQL Server");
    }
});

配置連接後,您可以簡單地 connect() 到服務器! connect() 函數使用回調來檢查連接是否成功。

通過 JavaScript 編寫查詢

您需要在 MySQL 數據庫中執行的幾乎所有操作都是通過查詢完成的 ,自然是用 SQL 編寫的。 query() connection的方法 instance 接受一個字符串,表示我們要發送到數據庫的查詢。

查詢可能會失敗或返回一些結果,因此我們將有另一個回調,其中一個是 errresult 根據手術的進展情況。

創建數據庫

讓我們從通過 Node 的 MySQL 驅動程序創建一個數據庫開始。您可以通過 CLI(如果已安裝)或任何形式的 GUI(官方或第三方)在服務器上創建數據庫。

或者,您可以使用我們創建的連接發送為您創建數據庫的查詢!讓我們創建一個新的 students_records 數據庫。在項目的根目錄下,在同一個 index.js 我們之前用過,我們添加一個query() 連接數據庫後調用,如果連接成功:

var mysql = require("mysql");

// Create connection configuration
var connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "",
});

// Connect to the server
connection.connect((err) => {
    if (err) {
      // Return error if present
      console.log("Error occurred", err);
    } else {
      // Create database
      console.log("Connected to MySQL Server");
      const query = "CREATE DATABASE students_records";
      connection.query(query, function (err, result) {
        if (err) {
          err;
        }
        console.log("New database created");
      });
    }
});

在驗證我們的連接是否成功後,我們執行了一個帶有查詢字符串的查詢 - 'CREATE DATABASE students_records' ,如果不存在,則創建一個新數據庫。現在,讓我們運行項目:

$ node index.js

結果是:

Connected to MySQL Server
New database created

驚人的!現在一個 students_records 數據庫存在,我們可以廢棄數據庫創建查詢並直接連接到 students_records 而是在配置中:

var connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "",
    database: "students_records",
});

創建記錄

就像在所有其他關係數據庫中一樣,MySQL 中的數據記錄存儲在 .一個表可以由任意數量的列和行組成,但它們必須保持一致 .數據庫中的列代表對象的特徵/字段,每一行代表一個條目。

這意味著我們需要預先創建一個表並定義其架構(每個列和類型),以便將新記錄添加到我們的數據庫中。

要在 MySQL 中創建新表,我們使用 CREATE TABLE 陳述。假設我們要創建一個 students students_records 中的表格 數據庫。同樣,一旦連接,我們就可以執行相關查詢:

var mysql = require("mysql");

var connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "",
    database: "students_records",
});

connection.connect((err) => {
    if (err) {
      console.log("Error occurred", err);
    } else {
      console.log("Connected to database");
      var sql = "CREATE TABLE students (id INT, name VARCHAR(255), course VARCHAR(255))";
      connection.query(sql, function (err, result) {
        if (err) {
          console.log(err);
        }
        console.log("New table created");
      });
    }
});

這將創建一個新表,該表可以保存具有 name 的記錄 和 course 領域!每個條目都有一個 namecourse ,即使其中一些為空。此外,我們將它們的類型設置為 VARCHAR 最大長度為 255 個字符。

在這裡您可以額外設置其他約束,例如某些字段是強制性的 (NOT NULL ) 或 PRIMARY KEY /FOREIGN KEY

CREATE TABLE students (
  id INT NOT NULL,
  name VARCHAR(255) NOT NULL,
  course VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID)
)

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

這裡,沒有一個字段可以設置為 NULL ,並且它們每個都有一些關聯的數據類型。

注意: 在 SQL 中,關鍵字是否大寫並不重要。 create table 在功能上等同於 CREATE TABLE ,如 varcharVARCHAR .大寫命令、關鍵字和約束是常見的約定,但這不是必需的。

創建記錄

INSERT INTO 查詢,後跟表名和 VALUES 映射到其列用於使用 SQL 插入/創建記錄!例如,讓我們添加一個 John Doe 到我們的 students 表:

var sql = "INSERT INTO students (id, name, course) VALUES (1, 'John Doe', 'Computer Science')";

不出所料,這條語句會在 students 中插入一條記錄(行) 表,包含 name 的值 和 course .像往常一樣,查詢可以通過 connection.query() 執行 :

var sql = "INSERT INTO students (id, name, course) VALUES (1, 'John Doe', 'Computer Science')";

// Just execute
connection.query(sql);
// Or execute with callback to handle results/errors
connection.query(sql, function (err, result) {
  // ...
});

閱讀記錄

我們不只是想存儲數據——我們還希望能夠讀取它。而且,如下所示,我們可以從 students 中檢索數據 SELECT 的表 查詢。

我們可以選擇特定記錄或使用通配符(* ) 來選擇所有可用的:

var sql = "SELECT * FROM students";
connection.query(sql, function (err, result) {
  console.log(result);
});

運行此代碼將返回我們表中存在的所有數據:

[
  RowDataPacket { id: 1, name: 'John Doe', course: 'Computer Science' },
  RowDataPacket { id: 2, name: 'Jane Doe', course: 'Art' }
]

您還可以使用 BETWEEN 創建一系列匹配行的語句:

SELECT * FROM students WHERE id BETWEEN 1 AND 5

這將返回所有 ID 在 1 到 5 之間的學生。

更新記錄

我們可以使用 UPDATE 用於更新數據庫表及其內容的語句。例如,您可以使用多個語句來識別某個記錄並更新該記錄。一般來說,id 應該是 PRIMARY KEY 用於標識一行,以及唯一值,所以 id 通常是用來搜索記錄的列。

假設我們要更新學生,John Doe 的,課程來自 Computer ScienceArt ,和他的表弟一起。約翰的 id1

var sql = "UPDATE students SET course = 'Art' WHERE id = 1";

connection.query(sql, function (err, result) {
  console.log(result);
});

像這樣的查詢的結果通常包括有關查詢如何影響表的詳細信息,這是您可以驗證結果是否按預期工作的方法:

 {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 1,
  serverStatus: 34,
  warningCount: 0,
  message: '(Rows matched: 1  Changed: 1  Warnings: 0',
  protocol41: true,
  changedRows: 1
}

刪除記錄

最後,要刪除記錄 - 我們使用 DELETE 語句,並指定要刪除哪些記錄:

var sql = "DELETE FROM students WHERE id = 1";
connection.query(sql, function (err, result) {
  console.log(result);
});

注意: 使用 DELETE 時要小心 語句,並指定 WHERE 條款仔細。此外,如果您不指定 WHERE 子句,整個表的內容都會被清除。

轉義查詢值

當軟件工程師允許在 SQL 調用中使用用戶輸入時,發現了一個常見的早期漏洞。例如,您可以有一個帶有輸入字段的搜索欄。用戶將插入一本書的名稱,該輸入將在查詢中使用,例如:

SELECT * FROM books WHERE name = user_input

user_input 自然會被替換為字符串,例如 'Foundation' .然而,這為巨大打開了一扇門 漏洞利用,就像逃避您構建的查詢並運行自己的查詢一樣簡單。

例如,如果系統被構建為天真地接受輸入並將其插入到查詢中,那麼用戶輸入 a; DROP TABLE books 就足夠了 利用您的查詢:

SELECT * FROM books WHERE name = a; DROP TABLE books

分號將完成前一條語句,然後運行下一條語句,從數據庫中刪除整個表並刪除所有書籍。這是一個SQL注入的簡單例子 ,而攻擊可能比這複雜得多。此外,並非所有攻擊都具有破壞性——攻擊者也可能只是讀取敏感數據,這是一種通常不為人知的無聲攻擊。

考慮到這些攻擊可能變得多麼普遍——大多數軟件包都具有基本的內置安全性。 mysql 為 Node 構建的驅動程序提供了幫助避免 SQL 注入的功能和措施。

最常用的方法是轉義值 並將它們用作命名參數:

const input = 'Foundation';

connection.query('SELECT * FROM books WHERE name = ?', [input], function (err, results, fields) {
// ... 
});

通過使用 ? 轉義字符 - 您轉義輸入並將其轉換為無法評估的文字字符串。如果有人在導致此參數的輸入字段中輸入了命令 - 它不會被評估為命令。它將被視為文字字符串,並且將發送查詢以查找名稱與該命令匹配的書。

該方法接受一個參數數組,這些參數按順序輸入到查詢中。如果查詢有 2 個帶註釋的參數,則列表中的第一項將映射到第一個參數,列表中的第二項將映射到第二個參數。

或者,您可以通過 JavaScript 的字符串格式顯式註入這些值並使用 escape() 不過,轉義可能的命令的方法 - 這種方法通常不太可讀:

const input = mysql.escape('Foundation');

connection.query(`SELECT * FROM books WHERE name = ${input}`, function (err, results, fields) {
// ... 
});

設置超時時間

每個與連接相關的操作都將在默認超時期限後終止,我們可以通過設置自己的首選超時會話來解決這個問題。這是通過將對像傳遞給 .query() 來完成的 函數,我們的查詢和超時會話(以毫秒為單位)作為該對象的字段:

connection.query({sql: 'SELECT * FROM students', timeout: 50000}, function (err, results) {
// ...
});

此代碼將運行 SELECT 如果沒有返回結果,查詢將在 50 秒後終止。

結論

MySQL 是一種常用的關係型數據庫。在本指南中,我們了解瞭如何為 Node.js 項目的 MySQL 服務器安裝驅動程序,如何建立與服務器的連接並執行 CRUD 操作。

最後,我們注意到了轉義用戶輸入的重要性,並研究了自定義超時時間。


Tutorial JavaScript 教程
  1. 如何在 Remix 中驗證表單

  2. 7.5.0 發布:動態導入和 F# 管道

  3. 為什麼 esm 加載程序找不到我的導入?

  4. JavaScript:比較字符串(可選地忽略大小寫),帶有示例

  5. 當專家感到無聊時,就會誕生通才

  6. 客戶希望將來修改 SPA 網站。

  7. 只是另一個 React 模板🤷‍♂️

  1. JavaScript ||:JavaScript 中的邏輯或 (||) 與空值合併運算符 (??)

  2. 在Javascript中檢測觸摸板與鼠標

  3. TC39 第 86 次會議的更新

  4. 了解演員模型

  5. JavaScript 是否支持逐字字符串?

  6. 重新創建 Material Design 的浮動標籤

  7. 如何使用 Svelte 構建您的下一個 Chrome 擴展程序

  1. 使用 AngularJS 和 Firebase 構建實時狀態更新應用

  2. 使用 HTTPS 運行 creat-react-app

  3. 使用 Javascript 的虛擬鼓組

  4. Make Life Easy - 一組用 React 製作的工具