Sendgrid-nodejs: La signature de la fonction de rappel ne respecte pas les conventions de nœud

Créé le 15 juin 2016  ·  25Commentaires  ·  Source: sendgrid/sendgrid-nodejs

C'est probablement une décision que vous avez prise de faire les choses d'une certaine manière, mais il semble qu'avec la version 3.0.4 de cette bibliothèque, le rappel passé à sg.API ne suit pas la convention de signature de la fonction de rappel de nœud standard de function (error, data) . Au lieu de cela, la réponse de l'API est toujours renvoyée en tant que premier objet.

Cela rend difficile de déterminer si quelque chose s'est mal passé, car nous sommes désormais responsables du déchiffrement de la réponse API brute et d'analyser manuellement les en-têtes de réponse et les codes d'état.

Je ne pense pas que cela devrait être la responsabilité des utilisateurs, mais de la bibliothèque elle-même. Et si les codes d'état changent? Et si le format de la réponse change? Que faire si une erreur se produit et que le format de données renvoyé devient différent, nul ou indéfini?

Le moins que l'on puisse faire pour résoudre ce problème est que la bibliothèque détermine si une erreur s'est produite et, si oui, remplit le premier paramètre avec un objet d'erreur (la réponse peut y être attachée). Si aucune erreur ne se produit, retournez null comme premier paramètre et l'objet de réponse comme deuxième paramètre.

help wanted community enhancement

Commentaire le plus utile

Ma solution actuelle est de vérifier le code d'état pour la réussite, par exemple:

function sendMail(mail) {
  return new Promise((resolve, reject) => {

    //Build request
    let request = sg.emptyRequest();
    request.method = 'POST';
    request.path = '/v3/mail/send';
    request.body = mail.toJSON();

    //Send request
    sg.API(request, response => {
      if (response && response.statusCode &&
        response.statusCode >= 200 && response.statusCode <= 299) {
        resolve(response);
      }
      reject(new SendMailError(
        'Sendgrid response error ' + response.statusCode
      ));
    });
  });
}

Comme vous pouvez le voir, c'est assez verbeux et nécessite beaucoup de passe-partout pour simplement envoyer un e-mail et vérifier si cela a fonctionné ou non.

L'API proposée serait quelque chose comme:

function sendMail(mail) {
  return new Promise((resolve, reject) => {

    //Build request
    let request = sg.emptyRequest();
    request.method = 'POST';
    request.path = '/v3/mail/send';
    request.body = mail.toJSON();

    //Send request
    sg.API(request, (error, response) => {
      if (error {
        reject(new SendMailError(error);
      }
      resolve(response);
    });
  });
}

Ou mieux encore, avec des promesses retournées:

function sendMail(mail) {

  //Build request
  let request = sg.emptyRequest();
  request.method = 'POST';
  request.path = '/v3/mail/send';
  request.body = mail.toJSON();

  //Send request
  return sg.API(request);
}

Et, idéalement, nous verrions le retour d'un assistant d'envoi de courrier dédié qui créerait la demande appropriée pour nous en arrière-plan, éliminant ainsi le besoin d'un assistant sendMail et d'un passe-partout:

sg.sendMail(mail);

Si c'est quelque chose qui vous intéresse, je vais chercher à faire des relations publiques pour cela.

Tous les 25 commentaires

Ma solution actuelle est de vérifier le code d'état pour la réussite, par exemple:

function sendMail(mail) {
  return new Promise((resolve, reject) => {

    //Build request
    let request = sg.emptyRequest();
    request.method = 'POST';
    request.path = '/v3/mail/send';
    request.body = mail.toJSON();

    //Send request
    sg.API(request, response => {
      if (response && response.statusCode &&
        response.statusCode >= 200 && response.statusCode <= 299) {
        resolve(response);
      }
      reject(new SendMailError(
        'Sendgrid response error ' + response.statusCode
      ));
    });
  });
}

Comme vous pouvez le voir, c'est assez verbeux et nécessite beaucoup de passe-partout pour simplement envoyer un e-mail et vérifier si cela a fonctionné ou non.

L'API proposée serait quelque chose comme:

function sendMail(mail) {
  return new Promise((resolve, reject) => {

    //Build request
    let request = sg.emptyRequest();
    request.method = 'POST';
    request.path = '/v3/mail/send';
    request.body = mail.toJSON();

    //Send request
    sg.API(request, (error, response) => {
      if (error {
        reject(new SendMailError(error);
      }
      resolve(response);
    });
  });
}

Ou mieux encore, avec des promesses retournées:

function sendMail(mail) {

  //Build request
  let request = sg.emptyRequest();
  request.method = 'POST';
  request.path = '/v3/mail/send';
  request.body = mail.toJSON();

  //Send request
  return sg.API(request);
}

Et, idéalement, nous verrions le retour d'un assistant d'envoi de courrier dédié qui créerait la demande appropriée pour nous en arrière-plan, éliminant ainsi le besoin d'un assistant sendMail et d'un passe-partout:

sg.sendMail(mail);

Si c'est quelque chose qui vous intéresse, je vais chercher à faire des relations publiques pour cela.

Merci @adambuczynski ,

En règle générale, nous prévoyons de mettre à jour la gestion des erreurs, mais nous ne l'avons pas encore défini. Nous tiendrons compte de ces commentaires le moment venu.

Si vous souhaitez fournir une pull request, nous avons besoin d'un CLA signé: https://github.com/sendgrid/sendgrid-nodejs/blob/master/CONTRIBUTING.md#cla

Nous avons mis en place une structure d'aide pour le type d'améliorations que vous proposez: https://github.com/sendgrid/sendgrid-nodejs/tree/master/lib/helpers/mail. Vous pouvez soit aider à modifier celui-ci, soit créer le vôtre dans le répertoire helpers.

Merci pour votre aide!

Oui, j'ai vu l'aide pour le courrier. Voulez-vous créer un assistant d'envoi de courrier sur cet objet?

Sa sonne bien pour moi :)

Les suggestions faites par @adambuczynski sont

Génial, merci pour la validation @beldenge!

Veuillez suivre ce numéro pour progresser. Si @adambuczynski crée une pull request, je la

@thinkingserious Je viens de vous envoyer le CA signé, j'espère avoir un peu de temps la semaine prochaine pour examiner cela.

@adambuczynski nous l'avons reçu et merci pour vos commentaires!

Salut les gars, je n'ai pas oublié ça, mais j'ai été un peu occupé avec plusieurs autres projets. J'espère toujours examiner cela à un moment donné :)

@thinkingserious J'ai

Êtes-vous d'accord avec cela? Je ne pense pas que je pourrai travailler avec le code autrement, car ça me fait mal au cerveau de le regarder :)

PS pourquoi n'utilisez-vous pas de linters :)

@adambuczynski ,

Nous utilisons ce linter: http://eslint.org avec le guide de style standard.

Lequel utilisez-vous? Si nous pouvons synchroniser et utiliser le même linter, ce serait merveilleux.

J'utilise également ESLiint, mais il ne semble pas que vous appliquiez beaucoup de règles car il y a encore tellement d'incohérences dans le code.

C'est la configuration que j'utilise: https://gist.github.com/adambuczynski/1fa24bcfc5d17b8d26e4c39ffca7560e#file -eslintrc-node-yaml

Je pense que cela offre un bon équilibre entre cohérence et bonnes pratiques, sans toutefois être trop ennuyeux.

Il n'y a pas .eslintrc.yaml fichier de configuration

@adambuczynski ,

Je suis heureux d'utiliser le vôtre, il a l'air solide :)

Veuillez l'ajouter dans le cadre de votre validation.

@thinkingserious, il est cependant configuré pour les fonctionnalités ES6, par exemple un avertissement lorsque vous utilisez var au lieu de let et utilisez l'analyseur ES6.

Est-ce correct ou préférez-vous utiliser ES5 uniquement pour la compatibilité ascendante?

Nous devons prendre en charge les versions Node.js: "0.10", "0.12", "iojs", "4"

Je suis d'accord avec l'approche plus moderne si nous ne rompons pas le support de ces versions.

Ok, j'ai gardé les var et juste corrigé les problèmes de style de code qui se sont posés. Créé un PR pour cela séparément de ce problème.

@thinkingserious J'implémente également une API Promise, mais les promesses natives n'ont été introduites que dans Node 0.11.13.

Plusieurs solutions, faites-moi savoir laquelle (ou combinaison) vous préférez:

  • Utilisez les promesses bluebird comme dépendance
  • Vérifiez si les promesses sont prises en charge ou non, lancez une erreur si elles ne le sont pas mais si les gens essaient de les utiliser
  • Permettez aux utilisateurs de définir l'implémentation de promesse qu'ils souhaitent utiliser en définissant simplement sendgrid.Promise sur n'importe quelle valeur.

Une combinaison de 2 et 3 serait probablement la plus simple et la plus flexible.

D'accord.

J'aime cette option: "Vérifier si les promesses sont prises en charge ou non, lancer une erreur si elles ne le sont pas mais si les gens essaient de les utiliser", mais aussi permettre aux utilisateurs de spécifier l'implémentation qu'ils souhaitent.

@thinkingserious parfait. J'ai quelque chose de prêt à être révisé, voulez-vous que je le transmette au même PR ou que je crée un PR distinct pour cela?

@adambuczynski vous pouvez garder le même PR, merci!

Voir # 261

@beldenge pourriez -vous ajouter un +1 au PR https://github.com/sendgrid/sendgrid-nodejs/pull/261 afin que l'équipe Sendgrid puisse le déplacer et le considérer pour fusion? Merci!

@adambuczynski J'ajouterai le +1 maintenant :)

Cette page vous a été utile?
0 / 5 - 0 notes