7
respostas

Erro na hora de enviar as informações Postman quando usa Api serviços

Quando estou tentando enviar as informações via postman, aparece um erro relacionado ao ISO format. moment, possivelmente algo relacionado ao formato da criação da data?!

Segue erro:

Deprecation warning: value provided is 
not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across 
all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.      
Arguments:
[0] _isAMomentObject: true, _isUTC: false, _useUTC: false, _l: undefined, _i: 
Invalid date, _f: undefined, _strict: undefined, _locale: [object Object]     
Error
    at Function.createFromInputFallback (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\moment\moment.js:319:25)
    at configFromString (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\moment\moment.js:2536:19)    at configFromInput (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\moment\moment.js:2977:13) 
    at prepareConfig (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\moment\moment.js:2960:13)   
    at createFromConfig (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\moment\moment.js:2927:44)    at createLocalOrUTC (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\moment\moment.js:3021:16)    at createLocal (D:\Alura\Node\Rest 
com Node - Api com Express e MySQL\node_modules\moment\moment.js:3025:16)     
    at hooks (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\moment\moment.js:16:29)
    at Atendimento.adiciona (D:\Alura\Node\Rest com Node - Api com Express e MySQL\models\atendimentos.js:10:30)     
    at D:\Alura\Node\Rest com Node - Api com Express e MySQL\controllers\atendimentos.js:17:21
TypeError: Cannot read property 'length' of undefined
    at Atendimento.adiciona (D:\Alura\Node\Rest com Node - Api com Express e MySQL\models\atendimentos.js:11:53)     
    at D:\Alura\Node\Rest com Node - Api com Express e MySQL\controllers\atendimentos.js:17:21
    at Layer.handle [as handle_request] (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\express\lib\router\route.js:137:13)  
    at Route.dispatch (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\express\lib\router\layer.js:95:5)
    at D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (D:\Alura\Node\Rest com Node - Api com Express 
e MySQL\node_modules\express\lib\router\index.js:335:12)
    at next (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\express\lib\router\index.js:275:10)  
    at jsonParser (D:\Alura\Node\Rest com Node - Api com Express e MySQL\node_modules\body-parser\lib\types\json.js:119:7)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

7 respostas

Segue meu código que estava usando até a hora que implementamos a API de serviços:

#

const moment = require('moment')
const axios = require('axios')
const conexao = require('../infraestrutura/conexao')

class Atendimento {
    adiciona(atendimento, res){
        const dataCriacao = moment().format('YYYY-MM-DD HH:MM:SS')
        const data = moment(atendimento.data, 'DD/MM/YYYY').format('YYYY-MM-DD HH:MM:SS')

        const dataEhValida = moment(data).isSameOrAfter(dataCriacao)
        const clienteEhValido = atendimento.cliente.length >= 5

        const validacoes = [
            {
                nome: 'data',
                valido: dataEhValida,
                message: 'Data deve ser maior ou igual a data atual'
            },
            {
                nome: 'cliente',
                valido: clienteEhValido,
                message: 'Cliente deve ter pelo menos cinco caracteres'
            }
        ]       

        const erros = validacoes.filter(campo => !campo.valido)
        const existemErros = erros.length

        if(existemErros){
            res.status(400).json(erros)
        }else{
            const atendimentoDatado = {...atendimento, dataCriacao, data}

            const sql = 'INSERT INTO Atendimentos SET ?'

            conexao.query(sql, atendimentoDatado, (erro, resultados) =>{
                if(erro){
                    res.status(400).json(erro)
                }else{
                    res.status(201).json(atendimento)
                }
            })

        }





    }

    lista(res){
        const sql = 'SELECT * FROM Atendimentos'

        conexao.query(sql, (erro, resultados)=>{
            if(erro){
                res.status(400).json(erro)
            }else{
                res.status(200).json(resultados)
            }
        })
    }

    buscaPorId(id, res) {
        const sql = `SELECT * FROM Atendimentos WHERE id=${id}` 

        conexao.query(sql, async (erro, resultados)=>{
            const atendimento = resultados[0]
            const cpf = atendimento.cliente
            if(erro){
                res.status(400).json(erro)
            }else{
                const {data} = await axios.get(`http://localhot:8082/${cpf}`)

                atendimento.cliente = data

                res.status(200).json(atendimentos)
            }
        })
    }

    altera(id, valores, res){
        if(valores.data){
            valores.data = moment(valores.data, 'DD/MM/YYYY').format('YYYY-MM-DD HH:MM:SS')
        }
        const sql = 'UPDATE Atendimentos SET ? WHERE id=?'

        conexao.query(sql, [valores, id], (erro, resultados)=>{
            if(erro){
                res.status(400).json(erro)
            }else{
                res.status(200).json({...valores, id})
            }
        })
    }

    deleta(id, res){
        const sql = 'DELETE FROM Atendimentos WHERE id=?'

        conexao.query(sql, id, (erro, resultados)=>{
            if(erro){
                res.status(400).json(erro)
            }else {
                res.status(200).json({id})
            }
        })
    }
}



module.exports = new Atendimento;

Boa tarde André, tudo certo?

Uma das motivações para você estar encontrando problemas como esse é o fato de que a biblioteca momentjs entrou em modo de manutenção após a publicação do curso, e alguns comportamentos indevidos não serão mais alterados.

A minha sugestão é utilizar o formato como

const dataCriacao = moment().format('YYYY-MM-DD')
const data = moment(atendimento.data, 'YYYY-MM-DD')

e já enviar a data neste formato nas requisições para a API.

Outra solução é utilizar uma biblioteca diferente para lidar com datas, como a date-fns ou date-and-time.

Espero ter ajudado e bons estudos!

Obrigado pela a ajuda! Deu certo aquela parte, mas agora cai em outro problema.

Está aparecendo que essa mensagem no postman: Insira aqui a descrição dessa imagem para ajudar na acessibilidade e já tentei apagar esse if que verifica a data, mas não deu certo. Segue o link do git caso posso me ajudar : https://github.com/Andreoew/Rest-com-Node-Api-com-Express-e-MySQL.git

João, tendei da forma que me disse, só não implementei as biblioteca porque meu conhecimentos ainda é pouco. Sobre instalar até consigo, mas me enrolo na parte de utilizar ela dentro do projeto. Mas tentei uma forma com que aparentemente está formatando as datas, mas ainda continua dando erro, poderia me ajudar? erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade Caso puder me ajudar ficarei muito grato.

Boa noite André, tudo certo?

Eu fiz algumas alterações na versão do projeto que estava hospedada no GitHub para que ele ficasse funcional, mas eu suspeito que ela já tenha diferenças consideráveis em comparação ao projeto que você desenvolveu até o momento atual. Preparei algumas sugestões e esclarecimentos sobre a minha resposta anterior:

Tenha muito cuidado com os arquivos de configuração! Eu notei que haviam credenciais (usuário e senha) para a conexão do banco de dados contidas no arquivo /infraestrutura/conexao.js. Não compartilhe senhas sensíveis dentro de arquivos de projeto em hipótese alguma. Se as credenciais presentes lá forem reais, sugiro deletar o repositório assim que possível e trocar qualquer sistema que utilize as mesmas credenciais. Se forem apenas senhas de um servidor de teste não tem tanto problema, mas ainda recomendaria trocar a senha.

Eu esqueci de mencionar um detalhe. O código

const dataCriacao = moment().format('YYYY-MM-DD')
const data = moment(atendimento.data, 'YYYY-MM-DD')

deveria ter um outro método sendo invocado na linha de baixo, para formatar a data da mesma forma:

const dataCriacao = moment().format('YYYY-MM-DD')
const data = moment(atendimento.data, 'YYYY-MM-DD').format('YYYY-MM-DD')

E quando você fosse fazer as requisições ao postman, deveria enviar as datas no mesmo formato: ano-mês-dia. Por exemplo, o dia 14 de abril de 2022 seria escrito como 2022-04-14.

O erro que você enviou na última captura de tela é referente à coluna cliente não estar recebendo um valor adequado. É possível observar que na resposta da requisição, junto do erro é mostrada a query onde chegam apenas os valores dataCriacao e data. Como eu não tive esse problema no repositório que você enviou, creio que haja alguma diferença na versão do projeto anterior que baixei.

Nós estamos trabalhando em melhorias para esses problemas do projeto, então deixo a dica de prosseguir para o curso de ORM com NodeJS: API com Sequelize e MySQL para aprender formas diferentes de lidar com os bancos que são mais robustas e práticas.

Eu deixo aqui o projeto em uma etapa intermediária baseado nas alterações que fiz em seu projeto: link

Espero ter ajudado e bons estudos!

Olá João, obrigado pela dica da senha, já fiz alteração por lá, no git, mas era somente do servidor de teste. Baixei o projeto com suas alterações...eu já havia tentado isso tb, mas sem sucesso, pelo menos no meu por aqui não está funcionando. Vou ver sua dica de curso conforme menciona acima, mas gostaria muito terminar esse projeto por aqui para finalizar esse curso. João, se não puder continuar me ajudando com isso, tudo bem, eu compreendo, mas caso você possa continuar, poderia implementar outra biblioteca conforme havia recomendado acima?! Fique a vontade caso esteja muito ocupado para perder tempo com isso...compreendo!!! Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Boa tarde André, espero que esteja bem.

Eu peguei a última versão do projeto disponibilizada no curso, fiz um clone e realizei algumas alterações necessárias.

Primeiramente, mudei os parâmetros de configuração para adequar ao servidor que eu estou rodando localmente. Também mudei o driver do banco de dados para o pacote npm chamado mysql2.

A data, deixei como o formato mencionado numa resposta anterior:

const dataCriacao = moment().format('YYYY-MM-DD')
const data = moment(atendimento.data, 'YYYY-MM-DD').format('YYYY-MM-DD')

Pelo Postman, você deve selecionar a opção para enviar as requisições como x-www-form-urlencoded, como mostra a imagem a seguir:

Exemplo de requisição no Postman contendo os campos de um agendamento

Além disso, havia um pequeno erro na passagem de um parâmetro de validação do tamanho do nome do cliente. Foi possível resolver utilizando a desestruturação da seguinte forma:

this.clienteEhValido = ( {tamanho} ) => tamanho >= 5
                            // ^ note as chaves

Você pode conferir o repositório já com essas alterações neste link e adequar ao seu arquivo de configurações para rodar o projeto.

Espero ter ajudado. Bons estudos!