Sendgrid-nodejs: La biblioteca no se puede prometer

Creado en 22 ene. 2016  ·  18Comentarios  ·  Fuente: sendgrid/sendgrid-nodejs

Para mantener la estructura y el enfoque de mi aplicación consistentes, estoy usando la función promisify de Bluebird para convertir las devoluciones de llamada en promesas.

Desafortunadamente, y parece deberse al uso de 'this' dentro de sendgrid.js, la promesa del método 'send' en SendGrid hace que 'this' se vuelva indefinido y, por lo tanto, 'api_user' no se puede recuperar y no se puede enviar el correo electrónico .

Es una pena, ya que me obliga a volver al enfoque de devolución de llamada.

¿Puedo sugerir que los componentes internos de la biblioteca enlacen el contexto correcto cuando se usa esto, o se usa _this (como parece estar definido dentro de sendgrid.js).

Si acepta solicitudes de extracción, me complacerá hacer estas correcciones yo mismo.

help wanted community enhancement

Comentario más útil

@antony @dslounge, en realidad ya existe una forma incorporada de manejar esto usando el método promisify de Bluebird pasando un contexto para que Bluebird lo use para "this"

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

Todos 18 comentarios

Hola @antony ,

Agregaremos esta solicitud a nuestro registro posterior.

Sí, aceptamos solicitudes de extracción y estaremos encantados de revisar sus cambios.

¡Gracias!

Genial, ¡gracias por eso!

Solo quería respaldar este problema. Tenía la esperanza de poder prometer pero no funcionó. @antony si terminas haciendo ese cambio, me facilitaría la vida: D

Por cierto, no es gran cosa envolver sendgrid.send en una promesa si alguien realmente lo necesita. Todo lo que tienes que hacer es (ejemplo 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, en realidad ya existe una forma incorporada de manejar esto usando el método promisify de Bluebird pasando un contexto para que Bluebird lo use para "this"

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

Me gustaría no usar Bluebird en absoluto. Cuando no se proporciona una devolución de llamada a sendgrid.send (), simplemente devuelva una promesa. Bluebird es en realidad una solución temporal

@mynameiscoffey, su solución parece la correcta.

Hola a todos,

Quizás algo útil para las personas que usan Parse y Sendgrid juntos y que han migrado a su propio servidor porque Parse está cerrando. Aquí está la versión "Parse.Promified" del código @dslounge (que quiero que

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

Hola a todos,

No estoy seguro de si el problema de 'esto' persiste en la nueva versión de esta biblioteca, así que mantendré esta abierta por ahora.

Puede consultar la nueva biblioteca aquí: https://github.com/sendgrid/sendgrid-nodejs/tree/v3beta. Saldrá de la versión beta en unas pocas semanas.

¡Gracias por su apoyo!

Con los mejores deseos,

Elmer

@thinkingserious, ¿has pensado en la sugerencia de @ manuel-di-iorio? Por ejemplo, ¿devolver promesas de su API si no se proporciona ninguna devolución de llamada? Eso eliminaría la necesidad de tener que usar la promisificación por completo.

Todavía no @adambuczynski , pero definitivamente estoy abierto a cualquier mejora en esta biblioteca.

Actualmente, acabamos de lanzar nuestro nuevo punto final v3 / mail / send fuera de la versión beta y en un futuro cercano arreglaremos cualquier error que surja desde el relanzamiento de todas nuestras bibliotecas ayer.

Dejo este boleto abierto para mayor consideración. ¡Se agradece cualquier comentario adicional que tenga!

@thinkingserious sí, he examinado el código, hay algunas mejoras que sugeriría. Veré si tengo tiempo para crear algunas relaciones públicas para ellos, incluido este.

He creado este contenedor por ahora para poder trabajar con sendgrid en una cadena de promesa:

/**
 * 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 ha agregado soporte aquí: https://github.com/sendgrid/sendgrid-nodejs/issues/261

Para ayudar a moverlo hacia arriba en la cola para la fusión, necesitamos comentarios y +1

¡Gracias a todos!

@thinkingserious Creo que

@adamreisnz , una corrección en su código: según la documentación, la función recibe un error como primer parámetro:

sg.API (solicitud, función (error, respuesta) {

De todos modos, gracias por compartir!

Ok, tal vez eso haya cambiado o tal vez me lo perdí, gracias :)
Desde entonces, he creado esta sencilla biblioteca contenedora para simplificar la interacción con el paquete Sendgrid: https://www.npmjs.com/package/sendgrid-mailer

¿Fue útil esta página
0 / 5 - 0 calificaciones