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

Dados p/ Servidor

Para enviar um objeto para o servidor, usei o trecho abaixo:

save(negociacao,cb) {
        let xhr = new XMLHttpRequest();
        xhr.open("POST", "/negociacoes", true);
        xhr.setRequestHeader("Content-type", "application/json");

        xhr.onreadystatechange = () => {
            if (xhr.readyState == 4) {

                if (xhr.status == 200) {
                    cb(JSON.parse(xhr.responseText));
                } else {
                    console.log(xhr.responseText);
                    cb("Não foi possível salvar a Negociação!", null);
                }

            }
        };
        xhr.send(JSON.stringify(negociacao));
    }

Porém o objeto vai assim para o servidor:

{"_data":"1990-12-19T03:00:00.000Z","_quantidade":"1","_valor":"11"}

o "_" antes de cada atributo foi inserido na classe, para dizer que não deve ser acessado de fora.

class Negociacao {

    constructor(data, quantidade, valor) {

        this._data = new Date(data.getTime());
        this._quantidade = quantidade;
        this._valor = valor;
        Object.freeze(this);
    }

    getData() {
        return new Date(this._data.getTime());
    }

    getQuantidade() {
        return this._quantidade;
    }

    getValor() {
        return this._valor;
    }

    getVolume() {
        return this._quantidade * this._valor;
    }

}

Mas esta convenção impede que o servidor funcione.

Para tal, tive que fazer a seguinte adequação, no arquivo server/app/api/index.js

api.cadastraNegociacao = function(req, res) {

   console.log(req.body);
   req.body._data = new Date(req.body._data.replace(/-/g,'/'));
   negociacoes.push(req.body);
   res.status(200).json("Negociação recebida");
};

req.body._data = new Date(req.body._data.replace(/-/g,'/'));

Como poderíamos resolver isso?

Pois se usarmos outro backend (Java + Jackson Mapper), que não pode ser alterado, pode inviabilizar a integração, fazendo com que seja necessário abrir mão da convenção e retirar o "_".

2 respostas

Você tem que acertar o json enviado a partir do cliente. Não precisa necessariamente usar o objeto negociacao direto.. vc pode criar um objeto literal a partir das informações dele com as propriedades da maneira necessária.

solução!

Na hora de enviar os dados, o que é enviado no JSON são as propriedades e todas as funções são ignoradas. Por exemplo, seus getters e setters deixam de existir no formato JSON. Sendo assim, no servidor você terá que tratar com os dados com o _. Isso não é incomum quando essa convenção é utilizada, não se assuste.