6
respostas

Erro ao recuperar resultado query

Ao tentar recuperar o resultado de varias query para criar um json não consigo add os resultado no json, fica sempre o json vazio, se execultar somente uma query consigo.

 const connection = app.app.persistencia.connectionFactory();
    const categoriaDAO = new app.app.persistencia.CategoriaDAO(connection);
    const creditoDAO = new app.app.persistencia.CreditoDAO(connection);
    const lancamentoDAO = new app.app.persistencia.LancamentoDAO(connection);

    let jsonObj = {};

    creditoDAO.buscaValorTodosCreditoMes(idUsuario, primeiroDiaMes, ultimoDiaMes, function (erro, resultado) {
      if (erro) {
        logger.info('Erro ao Buscar Credito para retorno de valor categoria' + erro);
        res.status(500).send(erro);
        return;
      }

      jsonObj.creditoMesAtual = resultado[0].credito;

    });

    creditoDAO.buscaValorTodosCreditoMes(idUsuario, primeiroDiaMesAnterior, ultimoDiaMesAnterior, function (erro, resultado) {
      if (erro) {
        logger.info('Erro ao Buscar Credito mes anterior para retorno de valor categoria' + erro);
        res.status(500).send(erro);
        return;
      }

      console.log("Credito mes anterior "+ resultado[0].credito);
      jsonObj.creditoMesAnterior = resultado[0].credito;

    });

    categoriaDAO.buscaPorcentagemPorCategoria(idUsuario, idCategoria, function (erro, resultado) {
      if (erro) {
        logger.info('Erro ao Buscar Valor total de lancamentos por categoria' + erro);
        res.status(500).send(erro);
        return;
      }

      jsonObj.porcentagemCategoria = resultado[0].porcentagem;

    });

res.status(200).json(jsonObj);
6 respostas

Olá Antonio Carlos, tudo bem? A princípio penso que está ocorrendo esse problema porque é necessário realizar a conversão das queries para JSON, você pode realizar usando a função toJSON() antes de adicionar os valores ao seu jsonObj, fazendo da seguinte forma:

jsonObj.creditoMesAtual = resultado[0].credito.toJSON();

Outro detalhe, não sei se você notou mas você tem dois metodos responsáveis por executar coisas diferentes, porém ambos estão com o mesmo nome: buscaValorTodosCreditoMes, verifica isso também!

Ola Jonilson tudo bem? obrigado pela ajuda, mais testei e o problema não e esse, o problema e de async, o sistema não espera o retorno da query para poder dar o retorno do request, e quando ah o retorno o json ainda não contem os valores do retorno da query. Como posso resolver o problema?

Segue os códigos controller.js

module.exports = {

  home(app, req, res){

    const utilData = require('../../config/util/UtilDate');

    const primeiroDiaMes = utilData.primeiroDiaMes();
    const ultimoDiaMes = utilData.ultimoDiaMes();
    const idUsuario = 1;
    const idCategoria = 5;

    var connection = 12;

    const service = new app.app.server.Service(connection);

    let jsonObj = {};

    service.retornarDadosUsuario(idUsuario, primeiroDiaMes, ultimoDiaMes, function (erro, resultado) {
      if (erro) {
        console.log('Erro ao Buscar Credito para retorno de valor categoria' + erro);
        res.status(500).send(erro);
        return;
      }

      console.log(resultado);
      await  = jsonObj.nome = resultado.nome;

    });

    service.retornarEndereco(idUsuario, idCategoria, function (erro, resultado) {
      if (erro) {
       console.log('Erro ao Buscar Credito mes anterior para retorno de valor categoria' + erro);
        res.status(500).send(erro);
        return;
      }

      // console.log("Credito mes anterior "+ resultado[0].credito);
      jsonObj.rua = resultado.rua;

    });

    service.retornarTelefone(idUsuario, function (erro, resultado) {
      if (erro) {
        console.log('Erro ao Buscar Valor total de lancamentos por categoria' + erro);
        res.status(500).send(erro);
        return;
      }

      jsonObj.numero = resultado.numero;

    });

    console.log("fim do codigo" + jsonObj);
    res.status(200).json(jsonObj);

    // res.status(200).json({'page': 'home', 'author': 'Mayke Alisson'});
  }

};

service.js

function Service(connection) {
  this._connection = connection;
}

Service.prototype.retornarDadosUsuario = function(idUsuario, primeiroDiaMes, ultimoDiaMes, callback){
  setTimeout(() => {
    return callback(null, {nome: 'Erick Wendel', id: idUsuario, 'primeiroDiaMes': primeiroDiaMes, 'ultimoDiaMes': ultimoDiaMes });
  });
};

Service.prototype.retornarEndereco = function(idUsuario, idCategoria, callback){
  setTimeout(() => {
    return callback(null, {'rua': 'dos bobos', idUser: idUsuario, 'categoria': idCategoria});
  });
};

Service.prototype.retornarTelefone = function(idUsuario, callback){
  setTimeout(() => {
    return callback(null, {'numero': '123123123', idUser: idUsuario});
  });
};


Service.prototype.retornarVeiculo = function(idUsuario, callback){
  setTimeout(() => {
    return callback(null, {'carro': 'Fuscao', idUser: idUsuario});
  });
};


module.exports = function () {
  return Service;
};

Nesse caso você pode utilizar o Async/Await, você pode dar uma olhada também no conceito de Promises, nesse artigo você pode conhecer os dois e vai conseguir adaptar seu código pra funcionar dessas formas!

Certo entendi, mudei o codigo e agora consigo pegar o valor corretamente de todas query, mais se alguma der erro recebo o erro na resposta do request mais no terminal tenho o seguinte erro : _http_outgoing.js:470 throw new ERR_HTTP_HEADERS_SENT('set'); Minha controller

module.exports = {

  home(app, req, res){

    const utilData = require('../../config/util/UtilDate');

    const primeiroDiaMes = utilData.primeiroDiaMes();
    const ultimoDiaMes = utilData.ultimoDiaMes();
    const idUsuario = 1;
    const idCategoria = 5;

    var connection = 12;

    const service = new app.app.server.Service(connection);

    let jsonObj = {};

    teste();

    async function teste(){

      await service.retornarDadosUsuario(idUsuario, primeiroDiaMes, ultimoDiaMes, function (erro, resultado) {
        if (erro) {
          console.log('Erro ao Buscar Credito para retorno de valor categoria' + erro);
          res.status(500).send(erro);
          return;
        }

        console.log(resultado);
        jsonObj.nome = resultado.nome;

      });

      await service.retornarEndereco(idUsuario, idCategoria, function (erro, resultado) {
        if (erro) {
          console.log('Erro ao Buscar Credito mes anterior para retorno de valor categoria' + erro);
          res.status(500).send(erro);
          return;
        }

        // console.log("Credito mes anterior "+ resultado[0].credito);
         jsonObj.rua = resultado.rua;

      });

      await  service.retornarTelefone(idUsuario, function (erro, resultado) {
        if (erro) {
          console.log('Erro ao Buscar Valor total de lancamentos por categoria' + erro);
          res.status(500).send(erro);
          return;
        }

        jsonObj.numero = resultado.numero;
        res.status(200).json(jsonObj)

      });

    }



    console.log("fim do codigo" + JSON.stringify(jsonObj));


  }

};

Bem, me parece que esse erro é quando você retorna mais de uma resposta, então acho que você poderia colocar um return no fim de cada método:

jsonObj.nome = resultado.nome;
return;
jsonObj.rua = resultado.rua;
return;
res.status(200).json(jsonObj)
return;

Tenta dessa forma!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software