在本教學中,您將學習如何從node.js應用程式中查詢MySQL中的表中的資料。
從node.js應用程式查詢MySQL資料庫中的資料的步驟如下:
以下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資料庫中的資料。