Resumo : neste tutorial, você aprenderá como consultar dados de uma tabela no MySQL a partir de uma aplicação Node.js.
Este tutorial continua de onde o tutorial Inserindo linhas em uma tabela do Node.js parou.
As etapas para consultar dados no banco de dados MySQL de um aplicativo Node.js são as seguintes:
- Estabeleça uma conexão com o servidor MySQL .
- Execute uma
SELECT
instrução e processe o conjunto de resultados. - Feche a conexão com o banco de dados.
Executando uma consulta simples
Crie um novo arquivo chamado select.js
no diretório do projeto e adicione o seguinte código para consultar os dados da todos
tabela do todoapp
banco de dados:
let mysql = require('mysql');
let connection = mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
});
connection.connect((err) => {
if (err) return console.error(err.message);
let sql = `SELECT * FROM todos`;
connection.query(sql, [true], (error, results, fields) => {
if (error) return console.error(error.message);
console.log(results);
});
// close the database connection
connection.end();
});
Linguagem de código: JavaScript ( javascript )
Como funciona.
Primeiro, importe o mysql.js
módulo:
let mysql = require('mysql');
Linguagem de código: JavaScript ( javascript )
Segundo, crie uma conexão de banco de dados usando o createConnection()
método e forneça detalhes de conexão como host, porta, usuário, senha e nome do banco de dados:
let connection = mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
});
Linguagem de código: JavaScript ( javascript )
Observe que armazenamos os valores dos detalhes da conexão no .env
arquivo:
DB_HOST=localhost
DB_PORT=3306
DB_USER=user
DB_PASSWORD=password
DB_NAME=todoapp
Linguagem de código: texto simples ( texto simples )
Terceiro, crie uma conexão com o servidor MySQL. Se houver um problema durante o processo de conexão, registre a mensagem de erro no console:
connection.connect((err) => {
if (err) return console.error(err.message);
// Connection successful, proceed with queries
// ...
});
Linguagem de código: JavaScript ( javascript )
Quarto, execute uma SELECT
consulta:
let sql = `SELECT * FROM todos`;
connection.query(sql, [true], (error, results, fields) => {
if (error) return console.error(error.message);
console.log(results);
});
Linguagem de código: JavaScript ( javascript )
Neste código, preparamos uma SELECT
instrução que recupera dados da todos
tabela. Em seguida, usamos o query()
método para executar a consulta.
Se o erro ocorrer durante a execução da consulta, registramos a mensagem de erro. Caso contrário, exibimos as linhas no console.
Por fim, feche a conexão com o banco de dados:
connection.end();
Linguagem de código: JavaScript ( javascript )
Vamos executar o select.js
programa.
node --env-file .env select.js
Linguagem de código: texto simples ( texto simples )
Saída:
[
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: 'Master Node.js MySQL', completed: 0 },
RowDataPacket { id: 4, title: 'Build Node.js / MySQL App', completed: 1 }
]
Linguagem de código: texto simples ( texto simples )
Ele retornou 4 linhas com cada linha envolvida em um RowDataPacket
objeto.
Passando dados para a consulta
O seguinte cria um select_completed.js
programa que recupera todos concluídos da todos
tabela:
let mysql = require('mysql');
let connection = mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
});
connection.connect((err) => {
if (err) return console.error(err.message);
let sql = `SELECT * FROM todos WHERE completed=?`;
connection.query(sql, [true], (error, results, fields) => {
if (error) return console.error(error.message);
console.log(results);
});
// close the database connection
connection.end();
});
Linguagem de código: JavaScript ( javascript )
Saída:
[
RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 },
RowDataPacket { id: 4, title: 'Build Node.js / MySQL App', completed: 1}
]
Linguagem de código: texto simples ( texto simples )
Neste exemplo, usamos o espaço reservado ( ?
) na SELECT
instrução:
let sql = `SELECT * FROM todos WHERE completed=?`;
Linguagem de código: JavaScript ( javascript )
e vincule valores a ele no query()
método:
connection.query(sql, [true], (error, results, fields) => {
if (error) return console.error(error.message);
console.log(results);
});
Linguagem de código: JavaScript ( javascript )
Node.js substituirá o ?
int da SELECT
instrução pelo true
argumento no query()
método ao executar a consulta.
Prevenindo injeção de SQL
Suponha que você queira consultar uma tarefa com base em um ID especificado. Você pode criar o seguinte código:
let mysql = require('mysql');
let connection = mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
});
let id = process.argv[2]; // pass argument to query
connection.connect((err) => {
if (err) return console.error(err.message);
let sql = `SELECT * FROM todos WHERE id=` + id;
connection.query(sql, [true], (error, results, fields) => {
if (error) return console.error(error.message);
console.log(results);
});
// close the database connection
connection.end();
});
Linguagem de código: JavaScript ( javascript )
Por exemplo, você pode selecionar a tarefa com id 1:
node --env-file .env select_by_id.js 1
Linguagem de código: CSS ( css )
Saída:
[ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 } ]
Linguagem de código: JavaScript ( javascript )
O programa retorna os dados esperados, mas possui um problema de segurança chamado injeção de SQL.
Isso significa que um usuário mal-intencionado pode manipular o programa passando o código SQL como argumento, causando potencialmente acesso não autorizado ou manipulação de dados no banco de dados.
Por exemplo, o malicioso pode passar o seguinte argumento ao programa para recuperar todas as linhas da todos
tabela:
node --env-file .env select_by_id.js '1 OR 1 = 1;'
Linguagem de código: JavaScript ( javascript )
Neste comando, o '1 OR 1 = 1;'
código SQL não é o id da tarefa.
Para resolver a injeção de SQL, você precisa usar o espaço reservado ( ?
) e vincular o valor ao parâmetro:
let sql = `SELECT * FROM todos WHERE completed=?`;
Linguagem de código: JavaScript ( javascript )
ou o escape()
método do objeto mysql
or connection
da seguinte forma:
let sql = `SELECT * FROM todos WHERE id = ` + mysql.escape(id);
Linguagem de código: JavaScript ( javascript )
Neste tutorial, você aprendeu como consultar dados no banco de dados MySQL a partir de um programa Node.js.