3
respostas

[Dúvida] Uncaught TypeError: data.forEach is not a function at http.onload

Boa tarde

Referente ao curso JS na web: CRUD com JavaScript assíncrono, na parte 01- Comunicaçao assíncrona, seguindo o mesmo código que o professor faz, aparece o seguinte erro:

Uncaught TypeError: data.forEach is not a function at http.onload (cliente_service.js:28:10)

Imagem do problema

Olhei em outros questionamentos por outros alunos que tiveram o mesmo problema, mas não tiveram uma solução, uma opção foi verificar se data seria um array, mas ele não é. Alguém sabe como resolver esta parte?

3 respostas

Olá, Alan! Tudo ok contigo?

Esse erro geralmente ocorre quando tentamos usar o método forEach em uma variável que não é do tipo array. No seu caso, o objeto data não está se comportando como um array, o que causa esse erro.

Aqui estão algumas observações que podem ajudar a solucionar o problema:

  1. Verifique a Estrutura dos Dados:

    O erro "Uncaught TypeError: data.forEach is not a function" ocorre porque data não é um array. Para resolver isso, você deve garantir que data seja, de fato, um array. Isso depende do que está sendo retornado pela requisição em http://localhost:3000/profile. Certifique-se de que o servidor esteja respondendo com um array JSON válido.

  2. Verifique o Uso de Arrow Functions:

    Note que você está usando uma função de seta (() => {}) dentro do forEach. Isso não é necessário, a menos que você esteja planejando fazer algo específico dentro dessa função. Se você só quer percorrer os elementos do array data e adicionar linhas à tabela, pode simplesmente fazer:

    data.forEach((elemento) => {
        tabela.appendChild(criaNovaLinha(elemento.nome, elemento.email));
    });
    
  3. Confira as Chamadas de XMLHttpRequest:

    Verifique se as chamadas XMLHttpRequest estão sendo feitas corretamente e se o servidor está respondendo como o esperado. Certifique-se também de que os endpoints como http://localhost:3000/profile/semanaPassada e http://localhost:3000/profile/semanaRetrasada estão disponíveis e respondendo corretamente.

  4. Lide com Erros nas Requisições:

    Para evitar problemas futuros, é importante adicionar tratamento de erros nas suas requisições. Você pode fazer isso adicionando um evento onerror às suas chamadas XMLHttpRequest. Isso permitirá que você identifique e trate erros de rede ou problemas de comunicação com o servidor.

Aqui está uma versão revisada do seu código com essas considerações:

http.open('GET', 'http://localhost:3000/profile');
http.send();

http.onload = () => {
    if (http.status === 200) {
        try {
            const data = JSON.parse(http.response);
            if (Array.isArray(data)) {
                data.forEach((elemento) => {
                    tabela.appendChild(criaNovaLinha(elemento.nome, elemento.email));
                });
            } else {
                console.error("O servidor não retornou um array JSON válido.");
            }
        } catch (error) {
            console.error("Erro ao analisar a resposta JSON:", error);
        }
    } else {
        console.error("Erro na requisição:", http.status, http.statusText);
    }
};

http.onerror = (error) => {
    console.error("Erro na requisição:", error);
};

// Continuar com as outras chamadas XMLHttpRequest (http2 e http3), se necessário.

Esta versão inclui tratamento de erros e verificações adicionais para garantir que o objeto data seja um array antes de usar o método forEach. Certifique-se de que o servidor retorne um JSON válido e que as chamadas XMLHttpRequest estejam configuradas corretamente.

Espero que esta explicação e as sugestões tenham ajudado a esclarecer o problema e a encontrar uma solução.

Espero que tenha te ajudado, abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor marque ele como solução! ✓

Aplicando o seu código teve o seguinte retorno.

Imagem do erro

Erro escrito: ```bash ►O servidor não retornou um array JSON válido. cliente service.js:51 ```

Oii Alan, tudo ok?

Desculpe a demora.

A imagem que você compartilhou indica que a requisição HTTP para o endpoint 'http://localhost:3000/profile' não retornou um array JSON válido. Isso significa que o servidor retornou algo que não pode ser analisado corretamente como um array JSON.

Para entender o que está acontecendo e como fazer para data ser um array e passar pelo forEach sem problemas, você pode realizar as seguintes etapas:

  1. Verificar a resposta do servidor: Primeiro, é importante verificar qual é a resposta real do servidor. Você pode usar o console para exibir http.response e inspecionar o que está sendo retornado. Isso ajudará a entender o formato da resposta e por que não está sendo analisada como um array JSON válido.

    Por exemplo, você pode adicionar o seguinte código logo após a linha const data = JSON.parse(http.response);:

    console.log("Resposta do servidor:", http.response);
    
  2. Corrigir o servidor (se necessário): Se a resposta do servidor não estiver no formato JSON esperado, você precisará verificar e corrigir o código do servidor para garantir que ele retorne um array JSON válido. Certifique-se de que o servidor esteja enviando os dados no formato JSON correto.

  3. Manipular respostas não esperadas: Se não for possível corrigir o servidor e você espera respostas variáveis que podem não ser sempre um array JSON, você pode adicionar alguma lógica para lidar com diferentes tipos de respostas. Por exemplo, você pode verificar se a resposta é um array e, se não for, manipular a resposta de acordo com o formato esperado.

    const data = JSON.parse(http.response);
    
    if (Array.isArray(data)) {
        data.forEach((elemento) => {
            tabela.appendChild(criaNovaLinha(elemento.nome, elemento.email));
        });
    } else {
        // Manipule a resposta de acordo com o formato esperado.
        // Por exemplo, se a resposta for um objeto único, você pode fazer algo como:
        tabela.appendChild(criaNovaLinha(data.nome, data.email));
    }
    

    Isso permite que você lide com diferentes tipos de respostas de forma mais flexível.

Lembre-se de que a solução exata depende da estrutura real da resposta do servidor e de como você deseja manipular esses dados em seu aplicativo. Certifique-se de ajustar seu código conforme a estrutura da resposta que você recebe do servidor.

No geral era isso! Tá?!

Se você tiver mais perguntas ou precisar de mais assistência no futuro, não hesite em perguntar.

Abraços e bons estudos.