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

Garantir ordem em inserção de valores com NODE JS

Tenho uma função que faz a leitura de um arquivo CSV, valida algumas informações e passa os resultados para uma função de callback, nessa função de callback faço a inserção desses dados no banco, porem apesar dos registros serem lidos na ordem correta eles não são inseridos na mesmo ordem. Ex:..

Leu a linha 1,2,3,4,5,6

Inseriu a linha 4,1,3,6,2,5

Como faço pra garantir que a ordem dos registros lidos permaneça na inserção dos dados ?

Seguem as funções que falei:

Função para LER arquivo CSV:

function lerCargaCSV(caminho, callback){

    var input = fs.createReadStream(caminho);
    var rl = readline.createInterface({
        input: input,
    });

    var dados = [];
    var resultados = [];
    var linhaAtual = 0;
    var erro = null;

    rl.on('line', function(line){

        dados = line.split(';');

        if(linhaAtual == 0){

            linhaAtual++;

            if(dados[0] != 'ARMARIO' || dados[1] != 'CLUSTER' ||
                dados[2] != 'CIDADE' || dados[3] != 'REGIONAL' ||
                dados[4] != 'QNTD_FAC' || dados[5] != 'PORTE' ||
                dados[6] != 'DT_INICIO'){
                erro = "Cabeçalho Incorreto - Favor Verificar - Base não carregada..";
                rl.close();
            }
        }
        else{

            var dataBr = dados[6].trim();
            var novaData = diasUteis(dataBr, 5);
            var dataAdicional = Math.round ( (Math.round ( (dados[4] / 800), 2 ) * 0.25) + Math.round ( (dados[4] / 800), 2 ) );

            var campos = dados.map(function(valor, indice){
                return removeAccents.remove(valor);
            });

            campos[6] = dataBr;
            campos[7] = novaData;
            campos[8] = dataAdicional;

            resultados.push(campos);
        }

    }).on('close', function(){
        input.destroy();
        callback(erro, resultados);
    });
};

Função do controller que chama a leitura e depois a inserção dos dados :

function fazUpload(request, response){

        uploader.doUpload(request, response, function(req, res, erro){

            var usuario = req.usuario.login;

            if(erro){
                logger.error('Usuário :  ' + usuario +', erro em requisição ao fazer upload. Erro :' + erro);
                res.status(500).json(erro);
            }
            else{

                _uploadCarga(req.files, function(erro, caminhoArquivo){

                    if(erro){
                        res.status(500).json(erro);
                    }
                    else{

                        leitorArquivo.lerCargaCSV(caminhoArquivo, function(erro, dados){

                            if(erro){
                                res.status(500).json(erro);
                            }
                            else{
                                _insereDadosCarga(dados, usuario).then(function(resultado){

                                    res.json(dados);
                                });
                            }
                        });
                    }
                });
            }
        });
    };

Função para INSERIR os dados que forma lidos:

function _insereDadosCarga(dados, usuario){

        var promises = dados.map(function(item){

            dao.insereCargaDados(item)
            .then(function(resultado){
                return resultado; 
            })
            .catch(function(erro) {
                logger.error('Usuário :  ' + usuario +', erro ao Inserir Dados de Carga no Armario: ' + item[0]  + '. Erro :' + erro);
            });
        });

        return Promise.all(promises);
    };
7 respostas

Opa, não deu para ficar muito claro onde está o problema. Acho curioso que se você pediu para iterar pelo array e inserir cada um, que essa inserção tenha sido desordenada. O array dados está chegando ok?

Oi Alberto, obrigado pelo retorno, pois é se coloco um console.log() no parametro dados da função _insereDadosCarga antes de percorrer o array com map ele imprime na ordem certa, porem quando esta dentro do map ele perde a ordenação, não imagino o que pode estar causando isso, achei que poderia ser algo relacionado a função lerCargaCSV mas depois vi que não pode ser, porque ele perde a ordenação apenas dentro do map, tem alguma sugestão ?

Alguem pra ajudar ?

solução!

Oi Breno, perdão pela demora, eu realmente me passei em acompanhar a thread. Olha, meu único chute é que a natureza assincrona do método que insere no banco pode afetar a ordem final dos dados inseridos.

Oi Alberto, obrigado pelo retorno, entendi, nesse caso uma opção seria passar todos o valores a serem inseridos de uma vez na query ao invés de percorrer o array e chamar a função toda vez, certo ?

Parece fazer sentido :).

blz, obrigado pela ajuda Alberto.