Sendgrid-nodejs: La bibliothèque n'est pas prometteuse

Créé le 22 janv. 2016  ·  18Commentaires  ·  Source: sendgrid/sendgrid-nodejs

Pour garder la structure et l'approche de mon application cohérentes, j'utilise la fonction promisify de Bluebird pour transformer les rappels en promesses.

Malheureusement, et cela semble être dû à l'utilisation de 'this' dans sendgrid.js, la promesse de la méthode 'send' sur SendGrid fait que 'this' devient indéfini, et par conséquent 'api_user' ne peut pas être récupéré, et le courrier électronique ne peut pas être envoyé .

C'est dommage car cela me force à revenir à l'approche de rappel.

Puis-je suggérer que les éléments internes de la bibliothèque lient le contexte correct lors de l'utilisation de ceci, ou _this est utilisé (comme il semble être défini dans sendgrid.js).

Si vous acceptez des pull requests, je serais ravi d'apporter ces correctifs moi-même.

help wanted community enhancement

Commentaire le plus utile

@antony @dslounge il existe déjà un moyen intégré de gérer cela en utilisant la méthode promisify de Bluebird en passant un contexte à utiliser par Bluebird pour "this"

const Promise = require('bluebird');
const sendgrid = require('sendgrid')(sendgridKey);
const sendEmail = Promise.promisify(sendgrid.send, { context: sendgrid });

Tous les 18 commentaires

Bonjour @antony ,

Nous ajouterons cette demande à notre historique.

Oui, nous acceptons les demandes d'extraction et nous serions ravis d'examiner vos modifications.

Merci!

Super - merci pour ça!

Je voulais simplement appuyer cette question. J'espérais pouvoir promettre mais cela n'a pas fonctionné. @antony si vous

Btw, ce n'est pas grave d'envelopper sendgrid.send dans une promesse si quelqu'un en a vraiment besoin. Tout ce que vous avez à faire est (exemple es6):

const Promise = require('bluebird');
const sendgrid = require('sendgrid')(sendgridKey);
const sendEmail = (params) => {
  return new Promise((resolve, reject) => {
    sendgrid.send(params, (err, json) => {
      if (err) {
        reject(err);
      } else {
        resolve(json);
      }
    });
  });
};

sendEmail(emailParams)
  .then((json) => {
    //success
  })
  .catch((err) => {
    //error
  });

@antony @dslounge il existe déjà un moyen intégré de gérer cela en utilisant la méthode promisify de Bluebird en passant un contexte à utiliser par Bluebird pour "this"

const Promise = require('bluebird');
const sendgrid = require('sendgrid')(sendgridKey);
const sendEmail = Promise.promisify(sendgrid.send, { context: sendgrid });

Je ne voudrais pas du tout utiliser Bluebird. Lorsqu'un rappel à sendgrid.send () n'est pas fourni, renvoyez simplement une promesse. Bluebird est en fait une solution de contournement temporaire

@mynameiscoffey votre solution ressemble à la bonne.

Hey les gens,

Peut-être quelque chose d'utile pour les personnes utilisant Parse et Sendgrid ensemble et ayant migré vers leur propre serveur car Parse se ferme. Voici la version "Parse.Promified" du code @dslounge (que je veux que vous

return new Parse.Promise(function (resolve, reject) {
  sendgrid.send({
    to: xxx,
    from: xxx,
    subject: xxx,
    text: xxx,
    replyto: xxx
  }, function (err, json) {
    if (err) {
      reject(err);
    } else {
      resolve(json);
    }
  });
});

Bonjour tout le monde,

Je ne suis pas sûr que le problème «this» persiste dans la nouvelle version de cette bibliothèque, donc je garde celui-ci ouvert pour le moment.

Vous pouvez consulter la nouvelle bibliothèque ici: https://github.com/sendgrid/sendgrid-nodejs/tree/v3beta. Il sortira de la version bêta dans quelques semaines.

Merci pour votre aide!

Meilleures salutations,

Elmer

@thinkingserious avez-vous réfléchi à la suggestion de @ manuel-di-iorio? Par exemple, renvoyez les promesses de votre API si aucun rappel n'est fourni? Cela éliminerait la nécessité de recourir à la promisification.

Pas encore @adambuczynski , mais je suis définitivement ouvert à toute amélioration de cette bibliothèque.

Actuellement, nous venons de sortir notre nouveau point de terminaison v3 / mail / send de la version bêta et dans un proche avenir, nous corrigerons tous les bogues qui apparaissent depuis la relance de toutes nos bibliothèques hier.

Je laisse ce ticket ouvert pour un examen plus approfondi. Tout commentaire supplémentaire que vous avez est apprécié!

@thinkingserious ouais j'ai examiné le code, il y a quelques améliorations que je suggérerais. Je vais voir si j'ai le temps de créer des PR pour eux, y compris celui-ci.

J'ai créé ce wrapper pour l'instant pour pouvoir travailler avec sendgrid dans une chaîne de promesses:

/**
 * Send email (wrapped in promise)
 */
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
      ));
    });
  });
}

@adambuczynski a ajouté le support ici: https://github.com/sendgrid/sendgrid-nodejs/issues/261

Pour aider à le déplacer vers le haut de la file d'attente pour la fusion, nous avons besoin de commentaires et de +1

Merci tout le monde!

@thinkingserious Je pense que vous

@adamreisnz , un correctif sur votre code: selon la documentation, la fonction reçoit une erreur comme premier paramètre:

sg.API (requête, fonction (erreur, réponse) {

Quoi qu'il en soit, merci de partager!

Ok, peut-être que cela a changé ou peut-être que je l'ai manqué, merci :)
J'ai depuis créé cette bibliothèque de wrapper simple pour simplifier l'interaction avec le package Sendgrid: https://www.npmjs.com/package/sendgrid-mailer

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

Questions connexes

Loriot-n picture Loriot-n  ·  4Commentaires

egges picture egges  ·  3Commentaires

TobiahRex picture TobiahRex  ·  3Commentaires

murphman300 picture murphman300  ·  4Commentaires

danielflippance picture danielflippance  ·  4Commentaires