August 9, 2019

nodejs連接MySQL開API:workbench

以 express 為例


文 / 西打藍 Siddharam

前言


我們這次要來開 API 給自己用,要完成這點,需要許多知識的融合,包含 SQL、後端語言以及 API 設計等,這項工作不簡單。

如果不熟悉 MySQL Workbench 如何開 schema 的話,可以先參考 這篇 來建立 table。

這次會以 nodejs 作為範例,並使用較好入門的 express 來開發 API,本文的目錄如下:

1. 透過 worknench 建立 table

2. 用 express 啟動 server 連結 MySQL

3. 撰寫 GET POST PUT DELETE 四種基本 API


透過 worknench 建立 table


首先,可以用下列 SQL 指令來建立一個產品列表的 table:


CREATE TABLE product_list (
  product_no varchar(10) NOT NULL,
  product_name varchar(100) DEFAULT NULL,
  create_date date DEFAULT NULL,
  PRIMARY KEY (product_no)
) 

INSERT INTO product_list VALUES 
    ('A01','大芭樂','2019-07-08'),('A02','蛋黃','2019-08-07'),('A03','糖果','2019-08-06'),
    ('A04','肉乾','2019-08-07'),('A05','水果','2019-08-08'),('A06','蛋糕','2019-08-08'),
    ('A07','西瓜','2019-08-08');


完成後,就能看見如下的 table。

新增 table。



用 express 啟動 server 連結 MySQL


我們需要安裝 express、MySQL、body-parser 三個套件:

npm install mysql --save
npm install express --save
npm install body-parser --save

接著,我們來啟動 server,監聽在 8080 端口。我們全部的程式碼都放在同一個 js 底下:


// server.js

var mysql = require('mysql');
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
 
//將request進來的 data 轉成 json()
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

// 監聽於 8080 端口
app.listen(8080, function () {
    console.log('Node app is running on port 8080');
});



此時,可以運行 node server 來啟動 server,如果懶的每次修改都要重啟的話,可以 npm install nodemon --save,然後到 package.json 進行修改:


  "scripts": {
    "serve": "nodemon server.js"
  }



然後下 nodemon,之後修改程式都不需要重啟了。

再來,我們需要回到 workbench 執行一行 SQL,來建立新使用者以符合最新版本 MySQL 的規定:


// 請將 username 以及 password 換成自己的
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';



接著來連線到本地的 MySQL:(workbench 要先確認連線哦,可以參考上一篇做法)


// server.js

// db

// host、user、password 請更換成自己的
var mc = mysql.createConnection({
    host: "localhost",
    user: "username",
    password: "password",
    insecureAuth : true
});

mc.connect();



撰寫 GET POST PUT DELETE 四種基本 API


有接過 API 的前端工程師就知道,GET 代表的是讀;POST 是新增;PUT 是修改;DELETE 則是刪除。接下來,我們就來寫出這幾支 API 吧:


// server.js

// 讀取

app.get('/show', function (req, res) {
    // 是為了修復 CORS 的問題而設
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

    mc.query('SELECT * FROM 0805_schema.product_list', function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'products list.' });
    });
});



// 新增

app.post('/add', function (req, res) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

    var addtData = req.body
    console.log(req.body)


    //  ? 會讀取後面的 addData
    mc.query('INSERT INTO 0805_schema.product_list SET ?', addData, function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'products insert.' });
    });
});



// 修改

app.put('/update', function (req, res) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

    var updateData = req.body
    var updateId = req.body.product_no
    console.log(req.body)


    // ? ? 會讀取陣列裡的值
    mc.query('UPDATE 0805_schema.product_list SET ? WHERE product_no = ?', [updateData, updateId], function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'products update.' });
    });
});



//刪除

app.delete('/remove', function (req, res) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    
    var deleteId = req.body.product_no
    console.log(req.body.product_no)

    mc.query('DELETE FROM 0805_schema.product_list WHERE product_no = ?', deleteId, function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'products delete.' });
    });
});



完成後,可以下載並打開 Postman,去測試以下完成的 API,除了 GET 以外,其他記得要帶入值:


http://localhost:8080/show //不用帶入


http://localhost:8080/add //帶入下列 json

{
    "product_no": "A09",
    "product_name": "開心果",
    "create_date": "2019-08-09"
}


http://localhost:8080/update //帶入下列 json

{
    "product_no": "A01",
    "product_name": "香腸",
    "create_date": "2019-07-08"
}


http://localhost:8080/remove //帶入下列 json

{
    "product_no": "A02"
}



終於完成了!以前在學前端時,總想自己開 API 給自己,而當時只會用 firebase 的 realtime database。而現在終於成功了,這種開心真的難以言語,希望大家都能成功哦,有任何疑問歡迎跟我說。


閱讀量




聯絡與合作


訂閱電子報,領「我當前 10+ 以上收入源有哪些」一文。

有文字採訪、網站開發,或是諮詢需求,皆可至個人網站參考作品,並聯繫 IG

或是想分享心情、聊聊天、交朋友,可以來秘密通道找我唷。

Email: frank@siddharam.com