iugu / iugu-node

iugu - Biblioteca para Node
33 stars 37 forks source link

Problema no tratamento de erros da API #2

Open felipou opened 9 years ago

felipou commented 9 years ago

O código de tratamento de erros na resposta da API procura por um atributo error, mas a documentação (e minha experiência com a API) diz que os erros virão em um atributo errors:

      if (response.error) {
        var err;
        if (res.statusCode === 401) {
          err = new Error.IuguAuthenticationError(response.error);
        } else {
          err = Error.IuguError.generate(response.error);
        }
        return callback.call(self, err, null);
      }

Fiz um teste básico com o seguinte código, verificando tanto por um error quanto por um errors, e funcionou corretamente:

      if (response.error || response.errors) {
        var err = response.error || response.errors;
        if (res.statusCode === 401) {
          err = new Error.IuguAuthenticationError(err);
        } else {
          err = Error.IuguError.generate(err);
        }
        return callback.call(self, err, null);
      }

Não fiz um pull request pois não pude testar corretamente e extensivamente esse código, então achei melhor reportar aqui. Espero ter ajudado :)

felipou commented 9 years ago

Acabei de ter um problema com esse tentativa de solução que enviei: uma resposta contendo um atributo errors cujo valor era um objeto vazio ({}). Tive que modificar da seguinte maneira (já está ficando feio o código, mas é uma solução paliativa pra mim, sugiro pensarem em alguma forma melhor de fazer isso):

      if (response.error || ( response.errors &&
            Object.keys( response.errors ).length > 0 ) ) {
        var err = response.error || response.errors;
        if (res.statusCode === 401) {
          err = new Error.IuguAuthenticationError(err);
        } else {
          err = Error.IuguError.generate(err);
        }
        return callback.call(self, err, null);
      }
claytonsilva commented 9 years ago

na verdade não ficou feio @felipou .. veja pelo stack overflow questão sobre tratamentos de objetos vazios:

http://stackoverflow.com/questions/4994201/is-object-empty

Talvez é questão de fazer uma função genéria isEmpty e aplicá-la para ficar mais "elegante"

lspecian commented 8 years ago

@felipou você pode enviar um exemplo da chamada que retorna errors? Obrigado.

felipou commented 8 years ago

curl https://api.iugu.com/v1/invoices/ASDF

Acabei de testar com um token de teste. O corpo do retorno foi: {"errors":"Invoice Not Found"}

Mas faz muito tempo que encontrei esse problema, e acredito que foi em outros endpoints. Mas esse foi o primeiro que testei aqui agora pra tentar achar esse tipo de retorno.