Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dependendo do nome da propriedade do Json, se tem resultados diferentes.

Dada a seguinte função de post:

function sincronizaPlacar() {
      var linhas = $("tbody>tr");//Pega todas as tr's filhas diretas do tbody.
      var placar = [];

      linhas.each(function() {
        var usuario = $(this).find("td:nth-child(1)").text();
        var palavras = $(this).find("td:nth-child(2)").text();

        var score = {
            usuario: usuario,
            pontos: palavras
        };

        placar.push(score);
      });

      var dados = {
          tabela: placar //ATRIBUTO EM QUESTÃO
      };
      $.post("http://localhost:3000/placar",dados,function() {
          console.log("Foi enviado para o servidor");
      }).fail(function() {
        console.log("falhou");
      });
}

Se eu uso o nome do atributo em questão diferente do conteúdo dele, como escrito acima, o POST não funciona dando o seguinte erro:

TypeError: Cannot read property '_id' of undefined
    at Datastore.prepareDocumentForInsertion (C:\Users\pedro\Alura\JQuery\alura-typer\servidor\node_modules\nedb\lib\datastore.js:384:21)
    at Datastore._insert (C:\Users\pedro\Alura\JQuery\alura-typer\servidor\node_modules\nedb\lib\datastore.js:347:24)
    at C:\Users\pedro\Alura\JQuery\alura-typer\servidor\node_modules\nedb\lib\executor.js:40:13
    at Object.process (C:\Users\pedro\Alura\JQuery\alura-typer\servidor\node_modules\nedb\node_modules\async\lib\async.js:731:21)
    at next (C:\Users\pedro\Alura\JQuery\alura-typer\servidor\node_modules\nedb\node_modules\async\lib\async.js:728:27)
    at Immediate.<anonymous> (C:\Users\pedro\Alura\JQuery\alura-typer\servidor\node_modules\nedb\node_modules\async\lib\async.js:24:16)
    at runCallback (timers.js:810:20)
    at tryOnImmediate (timers.js:768:5)
    at processImmediate [as _immediateCallback] (timers.js:745:5)

Mas se uso o nome do atributo igual ao do conteúdo, como por exemplo "placar: placar", o POST funciona. Por que isso ocorre?

3 respostas
solução!

Fala aí Pedro, tudo bem? O problema ocorre porque a API está esperando receber um JSON com o atributo placar, dessa maneira, se você não informar esse valor no JSON o mesmo não ira chegar na API e assim ocorrerá o erro.

O que você pode fazer para melhorar é omitir o segundo placar:

Maneira longa:

var dados = {
    placar: placar
};

Maneira curta:

var dados = {
    placar
};

O resultado é o mesmo, isso é possível á partir do JavaScript ES6, se o valor for igual o nome da chave, não precisa repetir.

Espero ter ajudado.

Entendo, muito obrigado.

Mágina, sempre que precisar não deixe de criar suas dúvidas.

Abraços