iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
自我挑戰組

後端工程師自我練習,使用Node.js來做後端server系列 第 5

[Day-5] Node.js [使用mysql原生語句連結資料庫]

  • 分享至 

  • xImage
  •  

[ Day 5 ]

說明:
建立一個商業動態網站,和資料庫互動,讀存刪改資料是必不可少的
因此今天將學習下使用套件和本機的mysql資料庫連結,並且進行簡單的CRUD指令

預先準備:
已經有一套可以連線的mysql資料庫和帳號密碼,且有相關資料表。

一、使用mysql套件和資料庫連結

var mysql = require('mysql');

var pool = mysql.createPool({
  user: 'root',
  password: '123456',
  host: 'localhost',
  port: '3306',
  database: 'demo',
  waitForConnections : true,
  connectionLimit : 10 //連線數上限
})

注意:此為學習用寫法,正式在開發時,將連線資訊寫在程式碼裡非常危險
需改為config設定方式配置,並加密

二、native select語法

// 取得連線
pool.getConnection((err, connection) => {

  if (err) {
    console.log(err)
  } else {
    connection.query( 'SELECT * FROM user', 
      function(err, rows) {
        //callback function
        console.log(rows)
        // console.log(err)
        // 釋放連線
        connection.release();
    });
  }
});

將原生的sql語句以參數形式傳入query方法
在callback function中取得row set
結果:
https://ithelp.ithome.com.tw/upload/images/20200918/20110911y6cNZTI7xU.png

三、增加查詢條件

connection.query( 'SELECT * FROM user where user_name = ' + param , 
      function(err, rows) {
        //callback function
        console.log(rows)
        // console.log(err)
        // 釋放連線
        connection.release();
    });

https://ithelp.ithome.com.tw/upload/images/20200918/20110911QoFlsujNXj.png
注意: sql injection
上例雖然可以成功撈取到特定的欄位條件,但是卻會造成SQL injection
假如我們將param 傳入

"'1'  or '' = ''"

https://ithelp.ithome.com.tw/upload/images/20200918/20110911jkeM15GUrz.png
全部的資料就被撈出來了,所以這種寫法在正式專案中是不能使用的

三之一、prepared statement
避免sql injection,改用prepared statement,將查詢欄位的資料先以佔位符固定下來,以防語句的串接

 connection.query( 'SELECT * FROM user where user_name = ? ', [param] , 
      function(err, rows) {
        //callback function
        console.log(rows)
        // console.log(err)
        // 釋放連線
        connection.release();
    });

再次帶入"'1' or '' = ''"
https://ithelp.ithome.com.tw/upload/images/20200918/20110911VvPmli7K1b.png

四、新增資料

pool.getConnection((err, connection) => {

  if (err) {
    console.log(err)
  } else {
    connection.query( 'INSERT INTO user(user_name) values (?) ', [param] , 
      function(err, rows) {
        //callback function
        console.log(rows)
        // console.log(err)
        // 釋放連線
        connection.release();
    });
  }
});

https://ithelp.ithome.com.tw/upload/images/20200918/20110911cqKv0ikX9r.png

可以看到成功新增後,回傳的自增主鍵值 insertId是15
這個id在某些需要複合步驟操作的情況下,會需要用到

五、修改資料

pool.getConnection((err, connection) => {

  if (err) {
    console.log(err)
  } else {
    connection.query( 'UPDATE user set user_name = ? where user_id = ?', [param, userId] , 
      function(err, rows) {
        //callback function
        console.log(rows)
        // console.log(err)
        // 釋放連線
        connection.release();
    });
  }
});

https://ithelp.ithome.com.tw/upload/images/20200918/20110911Gh4z1d2XXw.png

六、刪除資料

pool.getConnection((err, connection) => {

  if (err) {
    console.log(err)
  } else {
    connection.query( 'DELETE FROM user where user_id = ?', [userId] , 
      function(err, rows) {
        //callback function
        console.log(rows)
        // console.log(err)
        // 釋放連線
        connection.release();
    });
  }
});

https://ithelp.ithome.com.tw/upload/images/20200918/20110911qxkL5w0HJn.png

對資料庫有略為了解的朋友會曉得,不同的sql資料庫會有其專用的sql方言
另外在程式碼中管控sql語句字串也是非常不好維護的一件事
因此day6將介紹Knex.js,是一套Query Builder的nodejs套件
可以避免掉上述所說的那兩項問題

Day5結束


上一篇
[Day-4] Node.js [使用http建立CRUD rest api]
下一篇
[Day-6] Node.js [使用Query Builder套件Knex.js執行資料庫語句]
系列文
後端工程師自我練習,使用Node.js來做後端server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言