Node.js+MySQL查詢表資料

2019-10-18 00:54:41

在本教學中,您將學習如何從node.js應用程式中查詢MySQL中的表中的資料。

node.js應用程式查詢MySQL資料庫中的資料的步驟如下:

  1. 連線到MySQL資料庫,參閱:/25/13447.html
  2. 執行SELECT語句並處理結果集。
  3. 關閉資料庫連線。

執行一個簡單的查詢

以下select.js程式從todoapp資料庫的todos表中選擇所有資料:

let mysql = require('mysql');
let config = require('./config.js');

let connection = mysql.createConnection(config);

let sql = `SELECT * FROM todos`;
connection.query(sql, (error, results, fields) => {
  if (error) {
    return console.error(error.message);
  }
  console.log(results);
});

connection.end();

執行上面程式碼,得到以下結果 -

F:\worksp\mysql\nodejs\nodejs-connect>node select.js
openssl config failed: error:02001003:system library:fopen:No such process
[ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 },
  RowDataPacket {
    id: 2,
    title: 'Insert a new row with placeholders',
    completed: 0 },
  RowDataPacket { id: 3, title: 'Insert multiple rows at a time', completed: 0 },
  RowDataPacket { id: 4, title: 'It should work perfectly', completed: 1 },
  RowDataPacket { id: 5, title: 'Insert multiple rows at a time', completed: 0 },
  RowDataPacket { id: 6, title: '現在學習一次插入多行記錄(by www.tw511.com)', completed: 1 },
  RowDataPacket { id: 7, title: 'It should work perfectly', completed: 1 } ]

它按預期返回7行。

#將資料傳遞給查詢

以下select2.js程式僅選擇完成的工作:

let mysql = require('mysql');
let config = require('./config.js');

let connection = mysql.createConnection(config);

let sql = `SELECT * FROM todos WHERE completed=?`;
connection.query(sql, [true], (error, results, fields) => {
  if (error) {
    return console.error(error.message);
  }
  console.log(results);
});

connection.end();

執行上面程式碼,得到以下結果 -

F:\worksp\mysql\nodejs\nodejs-connect>node select2.js
openssl config failed: error:02001003:system library:fopen:No such process
[ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 },
  RowDataPacket { id: 4, title: 'It should work perfectly', completed: 1 },
  RowDataPacket { id: 6, title: '現在學習一次插入多行記錄(by www.tw511.com)', completed: 1 },
  RowDataPacket { id: 7, title: 'It should work perfectly', completed: 1 } ]

在這個例子中,我們使用問號(?)作為completed欄位的預留位置值。

當我們呼叫query()方法時,傳遞一個陣列作為第二個引數的值,預留位置將被序列的值替換。

select2.js程式返回兩行,其中completed列為1,這意味著在Node.js中為true

防止SQL隱碼攻擊

假設你想根據命令列中的引數的id來查詢一個todo,可以使用以下程式碼(select3.js):

let mysql = require('mysql');
let config = require('./config.js');

let connection = mysql.createConnection(config);

let id = process.argv[2]; // pass argument to query
let sql = `SELECT * FROM todos WHERE id=` + id ;

connection.query(sql, (error, results, fields) => {
  if (error) {
    return console.error(error.message);
  }
  console.log(results);
});

connection.end();

執行上面範例程式碼,得到以下結果 -

F:\worksp\mysql\nodejs\nodejs-connect>node select3.js 1
openssl config failed: error:02001003:system library:fopen:No such process
[ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 } ]

它正常工作。但是,有一個問題是可疑使用者可能通過傳遞引數中的SQL程式碼來利用該程式。

為了防止這種SQL隱碼攻擊,您需要使用前一個範例中的預留位置(?),或者使用mysql或連線物件的escape()方法,如下所示:

let sql = `SELECT * FROM todos WHERE id = ` + mysql.escape(id);

在本教學中,您已經學習了如何從node.js程式查詢MySQL資料庫中的資料。