Lendo arquivo, e validar no banco, mas não consigo pegar os erros

Minha rota

router.post(
  "/upload-motorista-admin",
  upload.single("file"),
  [jwtMiddleware],
  controller.uploadMotorista
);

Meu controller

uploadMotorista: async (req, res) => {
    const arquivo = req.file;
    console.log(arquivo);
    if (arquivo === undefined) {
      res.status(400).json({ error: "Deve selecionar um arquivo !" });
    } else {
      if (arquivo.mimetype !== "application/vnd.ms-excel") {
        res.status(400).json({ error: "O arquivo deve ser um CSV !" });
      } else {
        let nomesNaoImportados = [];
        fs.createReadStream(await arquivo.path)
          .pipe(csv({ delimiter: ":" }))
          .on("data", async function (row) {
            let achou = false;
            if (row.booking_status === "ACTIVE") {
              let cpf = String(row.cus_cpf).match(/[\d]+/g).join("");
              await Model.findAll({
                where: {
                  [Op.And]: Sequelize.where(
                    Sequelize.fn("lower", Sequelize.col("email")),
                    { [Op.eq]: row.cus_mail.toLowerCase() }
                  ),
                },
              }).then((result) => {
                if (result && result.length > 0) {
                  achou = true;
                  nomesNaoImportados.push(row.cus_name, (tipo = "email"));
                }
              });
              if (!achou) {
                Model.findAll({
                  where: {
                    cpf,
                  },
                }).then((result) => {
                  if (result && result.length > 0) {
                    achou = true;
                    nomesNaoImportados.push(row[1], (tipo = "cpf"));
                  }
                });
                if (!achou) {
                  let end_numero = 0;
                  if (row.cus_streetnum !== "NaN") {
                    end_numero = Number(row.cus_streetnum);
                  }
                  let data = {
                    codigoImportacao: row.cus_mail,
                    nome: row.cus_name,
                    cpf,
                    end_logradouro: row.cus_street,
                    end_numero,
                    end_cep: Number(row.cus_zip),
                    end_cidade: row.cus_city,
                    email: row.cus_mail,
                    tel_celular: row.cus_phone.substring(2),
                    end_uf: "SP",
                    end_pais: "1058",
                    senha: "123456",
                    idc_status: 1,
                    idc_termo_aceito: 3,
                    idc_equipamento: 3,
                  };
                  Model.create(data).then(async (result) => {
                    logger.info(
                      "Motorista.upload :: " +
                        result.email +
                        " : SUCESSO : cd_motorista : " +
                        result.cd_motorista
                    );
                    await MotoristaComplementoController.createMotoristaAdmin(
                      result.cd_motorista,
                      req,
                      res
                    );
                  });
                }
              }
            }
          })
          .on("end", async () => {
            console.log("end1: " + nomesNaoImportados.length);
          });
        console.log("end2: " + nomesNaoImportados.length);
        res.send({ upload: true });
     }
   }
 },

Ele importou e salvou a primeira vez.

Na segunda vez, ele não salvou, porque existe o email no banco, assim ele mudou a variável para achou = true;, e preencheu a lista em nomesNaoImportados.push(row.cus_name, (tipo = “email”));

Mas não consigo fazer a validação desta lista

logs

O que está faltando ?

Esse Model.findAll({ está sendo executado de forma assíncrona, ou seja, o IF que tem em seguida if (!achou) { já será executado antes mesmo do then referente ao Model.findAll. Bom, analisando o código, foi o que consegui perceber. Para testar, tu pode colocar um console log dentro do then e antes do IF para ver a ordem em que eles serão apresentados.

1 curtida

O findAll.js

module.exports = (model) => {
  return async (req, res) => {
    await model
      .findAll()
      .then((result) => res.status(200).send(result))
      .catch((error) =>
        res.status(400).json({ error: error.message, stack: error.stack })
      );
  };
};

Acaba que é uma função assíncrona msm. Capaz que deve ser por isso que a lógica está quebrando.

Para testar tente executar seu código dessa forma:

uploadMotorista: async (req, res) => {
  const arquivo = req.file;
  console.log(arquivo);
  if (arquivo === undefined) {
    res.status(400).json({ error: "Deve selecionar um arquivo !" });
  } else {
    if (arquivo.mimetype !== "application/vnd.ms-excel") {
      res.status(400).json({ error: "O arquivo deve ser um CSV !" });
    } else {
      let nomesNaoImportados = [];
      fs.createReadStream(await arquivo.path)
        .pipe(csv({ delimiter: ":" }))
        .on("data", async function (row) {
          let achou = false;
          if (row.booking_status === "ACTIVE") {
            let cpf = String(row.cus_cpf).match(/[\d]+/g).join("");
            await Model.findAll({
              where: {
                [Op.And]: Sequelize.where(
                  Sequelize.fn("lower", Sequelize.col("email")),
                  { [Op.eq]: row.cus_mail.toLowerCase() }
                ),
              },
            }).then((result) => {
              if (result && result.length > 0) {
                achou = true;
                nomesNaoImportados.push(row.cus_name, (tipo = "email"));
              }

              if (!achou) {
                Model.findAll({
                  where: {
                    cpf,
                  },
                }).then((result) => {
                  if (result && result.length > 0) {
                    achou = true;
                    nomesNaoImportados.push(row[1], (tipo = "cpf"));
                  }
                });
                if (!achou) {
                  let end_numero = 0;
                  if (row.cus_streetnum !== "NaN") {
                    end_numero = Number(row.cus_streetnum);
                  }
                  let data = {
                    codigoImportacao: row.cus_mail,
                    nome: row.cus_name,
                    cpf,
                    end_logradouro: row.cus_street,
                    end_numero,
                    end_cep: Number(row.cus_zip),
                    end_cidade: row.cus_city,
                    email: row.cus_mail,
                    tel_celular: row.cus_phone.substring(2),
                    end_uf: "SP",
                    end_pais: "1058",
                    senha: "123456",
                    idc_status: 1,
                    idc_termo_aceito: 3,
                    idc_equipamento: 3,
                  };
                  Model.create(data).then(async (result) => {
                    logger.info(
                      "Motorista.upload :: " +
                        result.email +
                        " : SUCESSO : cd_motorista : " +
                        result.cd_motorista
                    );
                    await MotoristaComplementoController.createMotoristaAdmin(
                      result.cd_motorista,
                      req,
                      res
                    );
                  });
                }
              }
            });
          }
        })
        .on("end", async () => {
          console.log("end1: " + nomesNaoImportados.length);
        });
      console.log("end2: " + nomesNaoImportados.length);
      res.send({ upload: true });
    }
  }
},

A única mudança que fiz foi jogar o bloco do IF para dentro do when do Model.findAll

1 curtida

Não funcionou

uploadMotorista: async (req, res) => {
    const arquivo = req.file;
    console.log(arquivo);
    if (arquivo === undefined) {
      res.status(400).json({ error: "Deve selecionar um arquivo !" });
    } else {
      if (arquivo.mimetype !== "application/vnd.ms-excel") {
        res.status(400).json({ error: "O arquivo deve ser um CSV !" });
      } else {
        let nomesNaoImportados = [];
        fs.createReadStream(arquivo.path)
          .pipe(csv({ delimiter: ":" }))
          .on("data", async function (row) {
            let achou = false;
            if (row.booking_status === "ACTIVE") {
              let cpf = String(row.cus_cpf).match(/[\d]+/g).join("");
              await Model.findAll({
                where: {
                  [Op.And]: Sequelize.where(
                    Sequelize.fn("lower", Sequelize.col("email")),
                    { [Op.eq]: row.cus_mail.toLowerCase() }
                  ),
                },
              }).then(async (result) => {
                if (result && result.length > 0) {
                  achou = true;
                  nomesNaoImportados.push(row.cus_name, (tipo = "email"));
                  console.log("nomesNaoImportados" + nomesNaoImportados.length);
                } else {
                  await Model.findAll({
                    where: {
                      cpf,
                    },
                  }).then((result) => {
                    if (result && result.length > 0) {
                      achou = true;
                      nomesNaoImportados.push(row[1], (tipo = "cpf"));
                    } else {
                      let end_numero = 0;
                      if (row.cus_streetnum !== "NaN") {
                        end_numero = Number(row.cus_streetnum);
                      }
                      let data = {
                        codigoImportacao: row.cus_mail,
                        nome: row.cus_name,
                        cpf,
                        end_logradouro: row.cus_street,
                        end_numero,
                        end_cep: Number(row.cus_zip),
                        end_cidade: row.cus_city,
                        email: row.cus_mail,
                        tel_celular: row.cus_phone.substring(2),
                        end_uf: "SP",
                        end_pais: "1058",
                        senha: "Zanzar@2021",
                        idc_status: 1,
                        idc_termo_aceito: 3,
                        idc_equipamento: 3,
                      };
                      Model.create(data).then(async (result) => {
                        logger.info(
                          "Motorista.upload :: " +
                            result.email +
                            " : SUCESSO : cd_motorista : " +
                            result.cd_motorista
                        );
                        await MotoristaComplementoController.createMotoristaAdmin(
                          result.cd_motorista,
                          req,
                          res
                        );
                      });
                    }
                  });
                }
              });
            }
          })
          .on("end", async () => {
            console.log("end1: " + nomesNaoImportados.length);
          });
        console.log("end2: " + nomesNaoImportados.length);
        res.send({ upload: true });
    }
  },

Ele imprimi end2 e end2 antes do gerar o select

Alguma ajuda ?