Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

MySQL Connection e problemas com a Promise do módulo

Olá, pessoal! Espero que estejam todos bem!

Então, estou utilizando os conceitos desse curso num projeto da faculdade e queria realizar o processo de separação das responsabilidades do controller user para o model, onde o controle teria somente as rotas que seriam consumidas, assim como a instrutora fez para o atendimento. Segue o código do controller user.js

const connection = require('../../config/mysql');
const User = require('../../models/user');

const routeBase = '/user'

module.exports = app => {
  //get all the users from the database
  app.get(routeBase + '/allusers', function(req, res) {
    const sql = "SELECT * FROM `user`";

      connection.query(sql, (err, result) => {
        if (err) throw err;

        let users = [];

        result.forEach(element => {
          users.push(element);
        });

        res.json(users);
      });
  });

A questão é que quando eu fui separar as responsabilidades das classes que utilizam a query de SELECT do MySQL, criando um método getAll(), e consequentemente eu dava push num array vazio de todos os users que eu encontravam, o array retornava vazio mesmo que a query estivesse correta. Descobri que isso ocorre porque o connection do MySQL retorna uma promisse e, por isso, o array retorna vazio pois a promisse ainda não finalizou quando eu realizo a separação dessas atribuições. Alguém tem ideia de como eu podeira resolver esse problema? Tentei de várias formas e não consegui.

Segue uma ideia do que eu gostaria de fazer

const connection = require('../config/mysql');
const user = require('../routes/user/user');

class User {
    add(user){
        const sql = 'INSERT INTO `user` SET ?';

        connection.query(sql, user, (erro) => {
            if(erro) {
                throw erro;
            }
        });
    }

    getAll(){
        const sql = "SELECT * FROM `user`";

        let users = [];

        connection.query(sql, (err, result) => {
          if (err) throw err;

          let users = [];

          result.forEach(element => {
            users.push(element);
          });
        });

        return users;
    }
}

module.exports = new User;
1 resposta
solução!

Consegui resolver o problema que tinha encontrado passando o res como parâmetro para a função getAll(). Não consegui tratar precisamente do funcionamento assíncrono da conexão com o MySQL, mas consegui modularizar o meu código.