Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá a todos! Estou modificando algumas funções que utilizam callback para utilizar asyn-await. Uso o padrão MVC. Meu problema é que chamo a função assíncrona na model ela é executada, não retorna erro mas não volta para o controller. Abaixo parte do código.
arquivo routes.js
const segurosRoutes = require('../controllers/segurosControllers.js');
module.exports = (app) => {
app.get('/estagio/movimentacoes/cadastroSeguros', segurosRoutes.segurosGetAll);
}
arquivo controllers.js
const segurosController = require('../models/segurosModels.js');
module.exports = { segurosGetAll, }
function segurosGetAll(req, res){
console.log("Entrando em Controllers Seguros: ")
segurosController.getAll(function (err, result){
if(err) {
console.log("Erro: " + err) throw err;
}else{ console.log("Resultado "+result)
}
})
}
arquivo models.js
const client = require('../../config/conexao.js');
const moment = require('moment');
module.exports = {
getAll,
}
async function getAll() {
m_sql = 'select A.*, B.seg_razaosocial, B.seg_nomefantasia, C.alu_nome, D.usu_username from seguros A left join seguradora B on A.seg_codigo = B.seg_codigo left join usuarios D on A.usu_codigo = D.usu_codigo left join alunos C on A.alu_codigo = C.alu_codigo ';
console.log("SQL em Seguros...."+m_sql)
console.log("-----------------------")
let retorno
try{
const retorno = await client.query(m_sql)
console.log("Retornando da SQL: "+retorno)
} catch(erro) {
console.log(erro)
retorno = erro
}
return retorno
}retorna um erro! Acusa erro no ponto(.) antes do then
16v é a linha do código que inicia a declaração da função.
/home/acneto/0-SistemasWeb/PjEstagio/CodigoFonte/0_2020_2/10-Out/v_3.7.0.3-6-get_set/api/models/segurosModels.js:16
async function getAll().then((err, result) => {>
7 minutos atrás, acneto.frc disse:
retorna um erro! Acusa erro no ponto(.) antes do then
16v é a linha do código que inicia a declaração da função.
/home/acneto/0-SistemasWeb/PjEstagio/CodigoFonte/0_2020_2/10-Out/v_3.7.0.3-6-get_set/api/models/segurosModels.js:16
async function getAll().then((err, result) => {
mas seu metodo getAll não retorna uma promise?
const retorno = await client.query(m_sql);
oque retorna query?
// modifica essa linha
segurosController.getAll().then((result) => {Retorna a mensagem do console.log dentro da model..Entrando.... depois a instrução executada em outro console.log, passa um traço e mostra [object Object] do outro console.log...É como se o retorno fosse indefinido
Entrando em Controllers Seguros:
SQL em Seguros....select A.*, B.seg_razaosocial, B.seg_nomefantasia, C.alu_nome, D.usu_username from seguros A left join seguradora B on A.seg_codigo = B.seg_codigo left join usuarios D on A.usu_codigo = D.usu_codigo left join alunos C on A.alu_codigo = C.alu_codigo
-----------------------
Retornando da SQL: [object Object]>
2 horas atrás, acneto.frc disse:
Retorna a mensagem do console.log dentro da model..Entrando.... depois a instrução executada em outro console.log, passa um traço e mostra [object Object] do outro console.log...É como se o retorno fosse indefinido
Entrando em Controllers Seguros:
SQL em Seguros....select A.*, B.seg_razaosocial, B.seg_nomefantasia, C.alu_nome, D.usu_username from seguros A left join seguradora B on A.seg_codigo = B.seg_codigo left join usuarios D on A.usu_codigo = D.usu_codigo left join alunos C on A.alu_codigo = C.alu_codigo
-----------------------
Retornando da SQL: [object Object]
// Seu Cenario
async function query(sql) {
return {data:"sucess"};
}
async function getAll() {
m_sql = 'select A.*, B.seg_razaosocial, B.seg_nomefantasia, C.alu_nome, D.usu_username from seguros A left join seguradora B on A.seg_codigo = B.seg_codigo left join usuarios D on A.usu_codigo = D.usu_codigo left join alunos C on A.alu_codigo = C.alu_codigo ';
console.log("SQL em Seguros...."+m_sql)
console.log("-----------------------")
let retorno
try{
retorno = await query(m_sql);
console.log("Retornando da SQL: "+retorno.data)
} catch(erro) {
console.log(erro)
retorno = erro;
}
return retorno;
}
getAll().then((result) => {
console.log('Result: ', result);
})
Seu erro está sendo o seguinte você está declarando uma variavel const retorno dentro do try e retornando let retornoOlá Wanderval obrigado por esta nos ajudando! Somos iniciantes no uso dessas funções por isso nossa insegurança.
Ficou um pouco confuso/perdido onde deveremos fazer as modificações. Quais serão no controllers e quais na Model. Também me perdi onde será inserido async e onde será o await. Como assyn-await são para usar em funções assíncronas só fizemos referência a estas funções na Model que é onde efetivamente será feito o acesso assíncrono (mysql/servidor) no controller nada foi declarado.
Obrigado!
Neto>
2 horas atrás, acneto.frc disse:
Olá Wanderval obrigado por esta nos ajudando! Somos iniciantes no uso dessas funções por isso nossa insegurança.
Ficou um pouco confuso/perdido onde deveremos fazer as modificações. Quais serão no controllers e quais na Model. Também me perdi onde será inserido async e onde será o await. Como assyn-await são para usar em funções assíncronas só fizemos referência a estas funções na Model que é onde efetivamente será feito o acesso assíncrono (mysql/servidor) no controller nada foi declarado.
Obrigado!
Neto
O que eu fiz foi criar um cenário, eu fiz uma pergunta pra você no post anterior sobre o que a query retorna, certo? Na maioria de libs Javascrip o client.post client.get retornam uma Promise, quando eu falo isso, eu digo o tipo do retorno não o conteudo em si.
Então se você ver eu criei o metodo query retornando como async torna o metodo uma promise. procure ler a respeito assim vai entender e ficar mais seguro. mas basicamente você so precisaria alterar a sua variavel que está errada ja que a chamada do metodo já está com o "then()".
Faça tentativas use o then na chamda do getAll e corrija o que apontei relacionado a variavel retorno.
entao caso haja problema coloque a sua tentativa aquiFiz a correção da variável retorno (tirei o let de inicialização) e tirei o return também mas não sei se está tirar esta certo. Também me compliquei quando você diz "Seu Cenário" porque venho com a função informada no router para controller no controller dentro da função chamo a função assíncrona que está na model.
--> router -> segurosGetAll
--> controllers -> segurosController.getAll
--> model --> async-await -> getAll
Quanto a ler a respeito tenho feito isso a algum tempo executei diversos exercícios de postagens e vídeo aulas e agora estou tentando implementar na aplicação em produção.
Pelas leituras entendi que quando usar async-await não usaria mais Promisses apesar do retorno dessas funções retornarem promisses. Caso tenha um tutorial ou qualquer material (exemplos) sobre o assunto e possa compartilhar tenho muito interesse. Não gostaria de sair da padrão MVC. Por enquanto muito obrigado.cara coloca o código da tentativa aqui é muito mais assertivo:
mas vai um video do Tulio do DevPleno
Boas! Obrigado pela orientação e sugestão. Assisti ao vídeo e estou tentando implementar aqui. Assim que eu conseguir alguma coisa eu posto e retorno.
Boa noite a todos! Em especial ao Wanderval!
Modifiquei o código mas ainda sem sucesso.
Agora recebo de retorno a resposta:
undefined
abaixo o controllers:
const segurosController = require('../models/segurosModels.js');
module.exports = {
segurosGetAll,
}
async function segurosGetAll(req, res) {
console.log('Acessando Models!!!')
try{
const retorno = await segurosController.getAll()
console.log(JSON.stringify(retorno))
}catch (err){
console.log(err)
}
}
abaixo a model.
conexão é a instância mysql
const conexao = require('../../config/conexao.js');
module.exports = {
getAll,
}
function getAll() {
m_sql = 'select * from seguros ';
console.log("SQL em Model Seguros...."+'\n'+m_sql)
conexao.query(m_sql);
console.log("GetAll Sql retornando: ")
}>
4 horas atrás, acneto.frc disse:
Boa noite a todos! Em especial ao Wanderval!
Modifiquei o código mas ainda sem sucesso.
Agora recebo de retorno a resposta:
undefined
abaixo o controllers:
const segurosController = require('../models/segurosModels.js');
module.exports = {
segurosGetAll,
}
async function segurosGetAll(req, res) {
console.log('Acessando Models!!!')
try{
const retorno = await segurosController.getAll()
console.log(JSON.stringify(retorno))
}catch (err){
console.log(err)
}
}
abaixo a model.
conexão é a instância mysql
const conexao = require('../../config/conexao.js');
module.exports = {
getAll,
}
function getAll() {
m_sql = 'select * from seguros ';
console.log("SQL em Model Seguros...."+'\n'+m_sql)
conexao.query(m_sql);
console.log("GetAll Sql retornando: ")
}
Pelo que percebi essa aplicação é node.js e não uma aplicação front-end
está aparecendo undefined pq você não esta retornando nada no response, isso é uma API náo pode deixar de usar response e request.
Essa é uma chamada de APi para rota como foi delegado para outro método manipular response(res) ou request(req) como é um get deve ter um response populado.
Segundo seu Model não está fazendo nada além de fazer console.log então mesmo chegando resposta do banco nada voltara para o controller.
app.get('/estagio/movimentacoes/cadastroSeguros', segurosRoutes.segurosGetAll);
Como você pode ver em nenhum momento foi utilizado o "res"nesse método
=====CONTROLLER
const segurosController = require('../models/segurosModels.js');
module.exports = {
segurosGetAll,
}
async function segurosGetAll(req, res) {
console.log('Acessando Models!!!')
try{
const retorno = await segurosController.getAll()
console.log(JSON.stringify(retorno))
}catch (err){
console.log(err)
}
}
=====ALTERACAO CONTROLLER
const segurosController = require("../models/segurosModels.js");
module.exports = {
segurosGetAll
};
async function segurosGetAll(req, res) {
console.log("=========SEGUROS GET ALL CONTROLLER========");
try {
const retorno = await segurosController.getAll();
console.log(JSON.stringify(retorno));
res.json(retorno);
} catch (err) {
console.log(err);
res.json({ error: true });
}
}
======MODEL======
const conexao = require('../../config/conexao.js');function getAll() {
m_sql = 'select * from seguros ';
console.log("SQL em Model Seguros...."+'\n'+m_sql)
conexao.query(m_sql);
console.log("GetAll Sql retornando: ")
}
=====ALTERACAO MODEL=======
// const client = require("../../config/conexao.js");
// const moment = require("moment"); // comentei pq nao vi nenhuma utilizacao
// APENAS TEST MOCK
const client = require("../config/conexao.js");
module.exports = {
getAll
};
async function getAll() {
console.log("=========GET ALL MODEL========");
const m_sql =
"select A.*, B.seg_razaosocial, B.seg_nomefantasia, C.alu_nome, D.usu_username from seguros A left join seguradora B on A.seg_codigo = B.seg_codigo left join usuarios D on A.usu_codigo = D.usu_codigo left join alunos C on A.alu_codigo = C.alu_codigo ";
let retorno;
try {
retorno = await client.query(m_sql);
} catch (error) {
throw new Error(error);
}
return retorno;
}
tenta acessar essa plataforma: https://codesandbox.io/s/zealous-brahmagupta-mqhxd?file=/src/index.js>
10 horas atrás, wanderval disse:
https://codesandbox.io/s/zealous-brahmagupta-mqhxd?file=/src/index.js
Muito interessante essa plataforma para testar e compartilhar códigos.
Fiz as correções recomendadas e agora apresenta a seguinte mensagem
TypeError: Converting circular structure to JSON
at JSON.stringify (<anonymous>)
at segurosGetAll (/home/acneto/0-SistemasWeb/async_await/v03/api/controllers/segurosControllers.js:11:26)
at process._tickCallback (internal/process/next_tick.js:68:7)
11:26 é o início da palavra
stringify
E no navegador apresenta: error: true.
Parece que o que está retornando da model não pode ser "convertido"
Caso faça console.log(retorno), apresenta um monte de informações.>
1 hora atrás, acneto.frc disse:
Fiz as correções recomendadas e agora apresenta a seguinte mensagem
TypeError: Converting circular structure to JSON
at JSON.stringify (<anonymous>)
at segurosGetAll (/home/acneto/0-SistemasWeb/async_await/v03/api/controllers/segurosControllers.js:11:26)
at process._tickCallback (internal/process/next_tick.js:68:7)
11:26 é o início da palavra
stringify
E no navegador apresenta: error: true.
Parece que o que está retornando da model não pode ser "convertido"
Caso faça console.log(retorno), apresenta um monte de informações.
Aparece erro true pq está quebrando no try do controller, apenas remova essa linha do stringify e substitua {error:true} pelo erro {error: err} ela não esta sendo usada é apenas um código que você havia colocado e eu manti, e confira o que é retornado do banco o formato de dado retornado.
Obs: você deve colcoar código aqui, e muito dificil apenas avaliar sua argumentação, e note que coloquei anotações e como não colocou eles aqui não sei se realizou as alterações, ex: no model deixei claro que a require que estava usando era de test, e deveria ser usado o arquivo de conexão orginal quando testado ecom amebiente real. mas se você somente oclocar os erros, ninguem aqui no forum vai conseguir analisar sua condição atual.>
20 horas atrás, wanderval disse:
Aparece erro true pq está quebrando no try do controller, apenas remova essa linha do stringify e substitua {error:true} pelo erro {error: err} ela não esta sendo usada é apenas um código que você havia colocado e eu manti, e confira o que é retornado do banco o formato de dado retornado.
Obs: você deve colcoar código aqui, e muito dificil apenas avaliar sua argumentação, e note que coloquei anotações e como não colocou eles aqui não sei se realizou as alterações, ex: no model deixei claro que a require que estava usando era de test, e deveria ser usado o arquivo de conexão orginal quando testado ecom amebiente real. mas se você somente oclocar os erros, ninguem aqui no forum vai conseguir analisar sua condição atual.
O código do routes ficou assim:
const segurosRoutes = require('../controllers/segurosControllers.js');
module.exports = (app) => {
app.get("/estagio/movimentacoes/cadastroSeguros", segurosRoutes.segurosGetAll);
};
Código do controllers:
const segurosController = require('../models/segurosModels.js');
module.exports = {
segurosGetAll,
};
async function segurosGetAll(req, res) {
console.log('============== Seguros GetAll Controller!!! ====================')
try{
const retorno = await segurosController.getAll();
//console.log(JSON.stringify(retorno));
res.json(retorno);
} catch (err){
console.log(err);
res.json({error: err})
}
}
E a model:
const conexao = require('../../config/conexao.js');
module.exports = {
getAll
};
async function getAll() {
console.log('========== Seguros Get All Model =============')
const m_sql = 'select * from seguros ';
let retorno;
try{
retorno = await conexao.query(m_sql);
console.log("GetAll Sql retornando: ")
console.log("\n"+retorno)
}catch(error) {
throw new Error(error);
}
return retorno;
}
E agora está retornando:
- no terminal
GetAll Sql retornando:
[object Object]
TypeError: Converting circular structure to JSON
- no browse:
error
: {}
Me parece que [object Object] retornado no controller seja um conteúdo que não consegue apresentar.Muito bem lá vai o código:
routes:
const segurosRoutes = require('../controllers/segurosControllers.js');
module.exports = (app) => {
app.get("/estagio/movimentacoes/cadastroSeguros", segurosRoutes.segurosGetAll);
};
controllers
const segurosController = require('../models/segurosModels.js');
module.exports = {
segurosGetAll,
};
async function segurosGetAll(req, res) {
console.log('============== Seguros GetAll Controller!!! ====================')
try{
const retorno = await segurosController.getAll();
console.log('============== Retornando .... Seguros GetAll Controller!!! ====================')
//console.log(JSON.stringify(retorno));
res.send(retorno);
} catch (err){
console.log(err);
res.json({error: err})
}
}
model
const conexao = require('../../config/conexao.js');};
async function getAll() {
console.log('========== Seguros Get All Model =============')
const m_sql = 'select * from seguros ';
console.log("SQL em Model Seguros...."+'\n'+m_sql);
console.log("\n")
let retorno;
try{
retorno = await conexao.query(m_sql);
console.log("GetAll Sql retornando: ")
console.log("\n"+retorno)
}catch(error) {
throw new Error(error);
}
return retorno;
}
E agora está retornando:
- no terminal
GetAll Sql retornando:
[object Object]
TypeError: Converting circular structure to JSON
- no browse:
error
: {}
Me parece que [object Object] retornado no controller seja um conteúdo que não consegue apresentar.O que o teu banco retorna? que tipo de dado, nao precisa postar aqui já que é um dado sencivel mas tente colcoar uma estrutura do objeto que é retornaod pelo banco
>
20 horas atrás, wanderval disse:
O que o teu banco retorna? que tipo de dado, nao precisa postar aqui já que é um dado sencivel mas tente colcoar uma estrutura do objeto que é retornaod pelo banco
Dentro da Modelo tem um colsole.log para apresentar o retorno do await
try{
retorno = await conexao.query(m_sql);
console.log("GetAll Sql retornando: ")
console.log("\n"+retorno)
}catch(error) {
throw new Error(error);
}
return retorno;
e mostra no console :
[object Object]
TypeError: Converting circular structure to JSON
Esse retorno eu não consigo manipular...
E no navegador retorna:
error: {}
resultado da instrução abaixo do controller
res.send(retorno)>
12 horas atrás, acneto.frc disse:
Dentro da Modelo tem um colsole.log para apresentar o retorno do await
try{
retorno = await conexao.query(m_sql);
console.log("GetAll Sql retornando: ")
console.log("\n"+retorno)
}catch(error) {
throw new Error(error);
}
return retorno;
e mostra no console :
[object Object]
TypeError: Converting circular structure to JSON
Esse retorno eu não consigo manipular...
E no navegador retorna:
error: {}
resultado da instrução abaixo do controller
res.send(retorno)
O motivo e que você recebe um array"[]" o que tá sendo exibido ai e que você esta recebendo um array de objetos "[object Object]"
então, se você conhece conceitos de programação sabe que somente iterando vai conseguir visualizar os conteúdos neste ponto ficaria o JSON.stringify(retorno) deste moto teria o objeto completo.
para ver o objeto da primeira posição console.log(retorno[0])>
10 horas atrás, wanderval disse:
O motivo e que você recebe um array"[]" o que tá sendo exibido ai e que você esta recebendo um array de objetos "[object Object]"
então, se você conhece conceitos de programação sabe que somente iterando vai conseguir visualizar os conteúdos neste ponto ficaria o JSON.stringify(retorno) deste moto teria o objeto completo.
para ver o objeto da primeira posição console.log(retorno[0])
Bom dia!
Em algum momento já tentei mostrar o conteúdo com "retorn[0]" mas retorna indefinido.
Abaixo o retorno neste momento no console:
GetAll Sql retornando:
undefined
============== Retornando .... Seguros GetAll Controller!!! ====================
undefined>
5 horas atrás, acneto.frc disse:
Bom dia!
Em algum momento já tentei mostrar o conteúdo com "retorn[0]" mas retorna indefinido.
Abaixo o retorno neste momento no console:
GetAll Sql retornando:
undefined
============== Retornando .... Seguros GetAll Controller!!! ====================
undefined
Olha seu foco deveria estar no model! pra descobrir o deu objeto que contem os dados do select do banco você precisa rever a lib que está usando pra acessar o banco dados, o que o arquivo conexão configura a configuração está correta? se está usando um lib de conexão no próprio site da lib tem a doc que mostra como isso deve ser feito. o fluxo funciona! mas sua dificuldade está no principal que é receber os dados nesse ponto você terá que focar nisso pq ai eu te pergunto pq você está se preocupando tanto com a modificação da estrutura se existe um problema em receber esses dados do banco?
>
17 horas atrás, wanderval disse:
Olha seu foco deveria estar no model! pra descobrir o deu objeto que contem os dados do select do banco você precisa rever a lib que está usando pra acessar o banco dados, o que o arquivo conexão configura a configuração está correta? se está usando um lib de conexão no próprio site da lib tem a doc que mostra como isso deve ser feito. o fluxo funciona! mas sua dificuldade está no principal que é receber os dados nesse ponto você terá que focar nisso pq ai eu te pergunto pq você está se preocupando tanto com a modificação da estrutura se existe um problema em receber esses dados do banco?
Bom dia!
Me preocupo com a estrutura porque nessa mesma aplicação tenho diversos cadastros funcionando mas utilizando callback e em alguns programas que acessam diversas tabelas tenho callback hell, por isso estou focando na estrutura, então como outros programas realizam CRUD normalmente não penso que seja a LIB.
Mas se é possível haver problemas por onde começar???>
13 horas atrás, acneto.frc disse:
Bom dia!
Me preocupo com a estrutura porque nessa mesma aplicação tenho diversos cadastros funcionando mas utilizando callback e em alguns programas que acessam diversas tabelas tenho callback hell, por isso estou focando na estrutura, então como outros programas realizam CRUD normalmente não penso que seja a LIB.
Mas se é possível haver problemas por onde começar???
não é um problema mas você precisa saber com que lib está trabalhando para a conexão com o banco, pelo seu relato já estava funcionando antes da sua alteração essa parte não mudou a parte de manipular o dado que vem do banco será da mesma forma, então apenas faça da mesmo forma já que realizou a alteração da estrutura somente reveja o código anterior que manipula a resposta do comando query assim sua alteração funcionará sem problema
>
20 horas atrás, wanderval disse:
não é um problema mas você precisa saber com que lib está trabalhando para a conexão com o banco, pelo seu relato já estava funcionando antes da sua alteração essa parte não mudou a parte de manipular o dado que vem do banco será da mesma forma, então apenas faça da mesmo forma já que realizou a alteração da estrutura somente reveja o código anterior que manipula a resposta do comando query assim sua alteração funcionará sem problema
se for voltar a model como antes terei que modificar a chamada no controller
function segurosCadastro(req, res){
segurosController.getAll(function (err, result){
console.log("Retorno de Seguros>... "+result[0]);
var id = result[0].sal_codigo;
e a model fica ficaria assim (usando callback)
function getAll (callback) {
m_sql = 'select * from seguros ';
conexao.query(m_sql, callback);
}
// await