Querying Data in MySQL Database from Node.js

摘要:在本教程中,您将学习如何从 Node.js 应用程序查询 MySQL 中的表中的数据。

从node.js应用程序查询MySQL数据库中的数据的步骤如下:

  1. 建立与 MySQL 数据库服务器的连接
  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(); 
Code language: JavaScript (javascript)

让我们运行 select.js 程序。

>node select.js
[ 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 } ]
Code language: JavaScript (javascript)

它按预期返回 4 行。

将数据传递给查询

以下 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();
Code language: JavaScript (javascript)

在此示例中,我们使用问号 (?) 作为已完成字段的占位符值。

当我们调用query()方法时,我们传递了一个数组作为第二个参数。占位符将按顺序替换为数组的值。

>node select2.js
[ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 },
  RowDataPacket { id: 4, title: 'It should work perfectly', completed: 1 } ]
Code language: JavaScript (javascript)

select2.js 程序返回两行, completed列为 1,这在 Node.js 中表示true

防止SQL注入

假设您想根据来自命令行参数的 id 查询待办事项,您可能会想出以下代码:

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();
Code language: JavaScript (javascript)

让我们选择 id 为 1 的待办事项:

    >node select.js 1
    [ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 } ]
Code language: JavaScript (javascript)

它工作正常。然而,存在一个问题,即可疑用户可能通过在参数中传递 SQL 代码来利用该程序。

为了防止这种 SQL 注入,您需要像前面的示例一样使用占位符 (?),或者使用mysqlconnection对象的escape()方法,如下所示:

let sql = `SELECT * FROM todos WHERE id = ` + mysql.escape(id);
Code language: JavaScript (javascript)

在本教程中,您学习了如何从 Node.js 程序查询 MySQL 数据库中的数据。

本教程有帮助吗?