DEV Community

Cover image for Filtrando no NodeJs
Bruno Padilha Rangel
Bruno Padilha Rangel

Posted on

Filtrando no NodeJs

Olá, meu nome é Bruno Padilha, sou desenvolvedor de software e esta é minha primeira publicação na área de programação.

Me deparei com um problema no meu trabalho que era filtrar um ou mais dados na database de acordo com o que é passado no req.query.Tentei procurar diversas fontes onde poderiam me ajudar na época com isso, entretanto, não encontrei nada. Como acabei conseguindo resolver depois de um tempo e agora estou aqui criando esse artigo para te ajudar se está passando por este mesmo problema.
Vamos lá?

Usarei aqui as tecnologias como banco de dados o postgres com ORM sequelize e a linguagem javascript.

Na imagem 1 é possível ver a tabela users no banco de dados Postgres:

imagem 1 - tabela users
imagem 1 - tabela users

Se eu simplesmente quiser passar um req.query dentro do findAll de User mostrado no código abaixo, vai “funcionar” como mostrado nas imagens 2 e 3.


import User from '../models/User';

class UserController {
 async filter(req, res) {
   const data = await User.findAll({
     where: req.query,
   });
   return res.status(200).json(data);
 }

imagem 2 - resultados com cabelo vermelho<br>
imagem 2 - resultados com cabelo vermelho

imagem 3 - resultados para genero feminino<br>
imagem 3 - resultados para genero feminino

Até mesmo se eu não passar nenhum dado no req.query, todos os resultados no banco de dados serão exibidos, como mostrado na imagem 4.

imagem 4 - resultados sem passar nenhum parâmetro no filtro<br>
imagem 4 - resultados sem passar nenhum parâmetro no filtro

Entretanto, se o frontend cometer algum erro de tentar pesquisar por uma coluna que não existe na tabela do banco de dados, ou alguém interceptar essa request para o backend e tentar procurar por algum parâmetro diferente, isso o banco de dados, dizendo que não existe na tabela o campo buscado, como mostrado nas figuras 5 e 6.

imagem 5 - erro no DB quando se passa parâmetros errados<br>
imagem 5 - erro no DB quando se passa parâmetros errados

imagem 6 - erro no DB quando se passa os parâmetros errados<br>
imagem 6 - erro no DB quando se passa os parâmetros errados

Com isso, precisamos desestruturar o req.query, criar uma constante where, que é onde você vai procurar dentro do findAll e validar que esses dados estão passando, pois, em um filtro, temos a opção de procurar ou não esses dados, correto? O código ficará assim:


async filter(req, res) {
   const { id, name, hair_color, gender } = req.query;
   const where = {};
   if (id) where.id = id;
   if (name) where.name = name;
   if (gender) where.gender = gender;
   if (hair_color) where.hair_color = hair_color;

   const data = await User.findAll({
     where,
   });
   return res.status(200).json(data);
 }

Como pode ser notado, eu criei um objeto where onde caso o parâmetro que foi passado no req.query exista, ele vai sendo incluído no objeto where. Para assim o mesmo ser pesquisado dentro do ORM.

Na imagem 7 trás os resultados mesmo passando uma coluna que não existe como req.query.

imagem 7 - retornando resultado mesmo que passe um req.query de uma coluna que não existe
imagem 7 - retornando resultado mesmo que passe um req.query de uma coluna que não existe

EXTRA

Também podemos fazer algo parecido com um include. Mostrarei agora na imagem 8 a tabela de groups que, como vimos na imagem 1, o id_group está linkando as duas.

imagem 8 - tabela groups no banco de dados
imagem 8 - tabela groups no banco de dados

import User from '../models/User';
import Group from '../models/Group';

class UserController {
 async filter(req, res) {
   const { id, name, hair_color, gender, group } = req.query;
   const where = {};
   if (id) where.id = id;
   if (name) where.name = name;
   if (gender) where.gender = gender;
   if (hair_color) where.hair_color = hair_color;

   const data = await User.findAll({
     where,
     include: { model: Group, where: group ? { group } : {} },
   });
   return res.status(200).json(data);
 }

E seguem diferentes resultados nas imagens 9, 10, 11 e 12. Nota-se que na imagem 11 não vai resultar em nenhum dado, pois não existe alguém de cabelo preto no group Teste3.

imagem 9 - resultado mostrando o filtro com group Teste3<br>
imagem 9 - resultado mostrando o filtro com group Teste3

imagem 10 - resultado mostrando o filtro com group Teste2<br>
imagem 10 - resultado mostrando o filtro com group Teste2

imagem 11 - não retornando nenhum resultado mostrando o filtro com group Teste 3 e cabelo de cor black.<br>
imagem 11 - não retornando nenhum resultado mostrando o filtro com group Teste 3 e cabelo de cor black.

imagem 12 - retornando a combinação de resultados de roup Teste2 com cabelo de cor black.<br>
imagem 12 - retornando a combinação de resultados de roup Teste2 com cabelo de cor black.

Muito obrigado por ler até aqui, espero que goste e estou totalmente aberto a críticas e melhorias no código. Espero ter ajudado.

Top comments (1)

Collapse
 
elissonmichael profile image
Élisson Michael

Obrigado por compartilhar esse material.