Consultando dados no banco de dados MySQL de Node.js

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:

Executando uma consulta simples

Crie um novo arquivo chamado select.jsno diretório do projeto e adicione o seguinte código para consultar os dados da todostabela do todoappbanco 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.jsmó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 .envarquivo:

DB_HOST=localhost
DB_PORT=3306
DB_USER=user
DB_PASSWORD=password
DB_NAME=todoappLinguagem 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 SELECTconsulta:

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 SELECTinstrução que recupera dados da todostabela. 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.jsprograma.

node --env-file .env select.jsLinguagem 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 RowDataPacketobjeto.

Passando dados para a consulta

O seguinte cria um select_completed.jsprograma que recupera todos concluídos da todostabela:

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 SELECTinstruçã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 SELECTinstrução pelo trueargumento 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 1Linguagem 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 todostabela:

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 mysqlor connectionda 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *