Sendgrid-nodejs: A biblioteca não é promissora

Criado em 22 jan. 2016  ·  18Comentários  ·  Fonte: sendgrid/sendgrid-nodejs

Para manter a estrutura e abordagem do meu aplicativo consistentes, estou usando a função promisify do Bluebird para transformar retornos de chamada em promessas.

Infelizmente, e parece ser devido ao uso de 'this' dentro de sendgrid.js, prometendo o método 'send' no SendGrid faz com que 'this' se torne indefinido e, portanto, 'api_user' não pode ser obtido e o e-mail não pode ser enviado .

Isso é uma pena, pois me força a voltar à abordagem de retorno de chamada.

Posso sugerir que os componentes internos da biblioteca vinculem o contexto correto ao usar isso, ou _este é usado (como parece ser definido em sendgrid.js).

Se você aceitar solicitações pull, ficarei feliz em fazer essas correções sozinho.

help wanted community enhancement

Comentários muito úteis

@antony @dslounge , na verdade, já existe uma maneira integrada de lidar com isso usando o método promisify do Bluebird, passando um contexto para o Bluebird usar para "este"

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

Todos 18 comentários

Olá @antony ,

Vamos adicionar este pedido ao nosso registo anterior

Sim, aceitamos solicitações pull e ficaremos felizes em revisar suas alterações.

Obrigado!

Ótimo - obrigado por isso!

Eu só queria enfatizar essa questão. Eu esperava poder prometê-lo, mas não funcionou. @antony se você acabar fazendo essa mudança, isso tornaria minha vida mais fácil: D

A propósito, não é grande coisa envolver sendgrid.send em uma promessa se alguém realmente precisa dela. Tudo o que você precisa fazer é (exemplo 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 , na verdade, já existe uma maneira integrada de lidar com isso usando o método promisify do Bluebird, passando um contexto para o Bluebird usar para "este"

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

Eu gostaria de não usar o Bluebird. Quando um retorno de chamada para sendgrid.send () não é fornecido, apenas retorne uma promessa. Bluebird é na verdade uma solução temporária

@mynameiscoffey sua solução parece a correta.

Olá pessoal,

Talvez algo útil para pessoas que usam o Parse e o Sendgrid juntos e migraram para seu próprio servidor porque o Parse está fechando. Aqui está a versão "Parse.Promified" do código @dslounge (que eu quero que você

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);
    }
  });
});

Olá a todos,

Não tenho certeza se o problema 'este' persiste na nova versão desta biblioteca, então estou mantendo este aberto por enquanto.

Você pode verificar a nova biblioteca aqui: https://github.com/sendgrid/sendgrid-nodejs/tree/v3beta. Ele sairá da versão beta em algumas semanas.

Obrigado por seu apoio!

Obrigado pela atenção,

Elmer

@Pensamento sério , você já pensou na sugestão de @manuel-di-iorio? Por exemplo, retornar promessas de sua API se nenhum retorno de chamada for fornecido? Isso eliminaria a necessidade de usar a promisificação por completo.

Ainda não @adambuczynski , mas estou definitivamente aberto a quaisquer melhorias nesta biblioteca.

Atualmente, acabamos de lançar nosso novo endpoint v3 / mail / send fora do beta e, em um futuro próximo, corrigiremos quaisquer bugs que surgirem desde o relançamento de todas as nossas bibliotecas ontem.

Estou deixando este tíquete aberto para uma análise mais aprofundada. Agradecemos qualquer feedback adicional!

@thinkingserious yeah Eu olhei para o código, existem algumas melhorias que eu sugeriria. Vou ver se tenho tempo para criar alguns RPs para eles, incluindo este.

Eu criei este wrapper por enquanto para poder trabalhar com sendgrid em uma cadeia de promessa:

/**
 * 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 adicionou suporte aqui: https://github.com/sendgrid/sendgrid-nodejs/issues/261

Para ajudar a movê-lo para cima na fila de mesclagem, precisamos de comentários e + 1s

Obrigado a todos!

@thinkingserious , acho que você pretendia criar um link para o PR, # 261 :)

@adamreisnz , uma correção em seu código: de acordo com a documentação, a função recebe erro como primeiro parâmetro:

sg.API (solicitação, função (erro, resposta) {

De qualquer forma, obrigado por compartilhar!

Ok, talvez isso tenha mudado ou talvez eu tenha perdido, obrigado :)
Desde então, criei esta biblioteca de wrapper simples para simplificar a interação com o pacote Sendgrid: https://www.npmjs.com/package/sendgrid-mailer

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

thinkingserious picture thinkingserious  ·  4Comentários

nicoasp picture nicoasp  ·  3Comentários

danielflippance picture danielflippance  ·  4Comentários

polkhovsky picture polkhovsky  ·  3Comentários

metalshan picture metalshan  ·  3Comentários