Sendgrid-nodejs: Perpustakaan tidak dapat dijanjikan

Dibuat pada 22 Jan 2016  ·  18Komentar  ·  Sumber: sendgrid/sendgrid-nodejs

Untuk menjaga agar struktur dan pendekatan aplikasi saya konsisten, saya menggunakan fungsi promisify Bluebird untuk mengubah callback menjadi promise.

Sayangnya, dan tampaknya karena penggunaan 'ini' di dalam sendgrid.js, menegaskan metode 'kirim' pada SendGrid menyebabkan 'ini' menjadi tidak terdefinisi, dan karenanya 'api_user' tidak dapat diambil, dan email tidak dapat dikirim .

Ini memalukan karena memaksa saya kembali ke pendekatan panggilan balik.

Bolehkah saya menyarankan agar internal perpustakaan mengikat konteks yang benar saat menggunakan ini, atau _ini digunakan (seperti yang tampaknya didefinisikan dalam sendgrid.js).

Jika Anda menerima permintaan tarik, saya akan dengan senang hati melakukan perbaikan ini sendiri.

help wanted community enhancement

Komentar yang paling membantu

@antony @dslounge sebenarnya sudah ada cara yang dibangun untuk menangani ini menggunakan metode promisify Bluebird dengan meneruskan konteks untuk Bluebird untuk digunakan untuk "ini"

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

Semua 18 komentar

Halo @antony ,

Kami akan menambahkan permintaan ini ke log belakang kami.

Ya, kami menerima permintaan penarikan dan dengan senang hati akan meninjau perubahan Anda.

Terima kasih!

Bagus - terima kasih untuk itu!

Saya hanya ingin membahas masalah ini. Saya berharap saya bisa berjanji tetapi tidak berhasil. @antony jika Anda akhirnya membuat perubahan itu akan membuat hidup saya lebih mudah: D

Btw, bukan masalah besar untuk membungkus sendgrid.send dalam janji jika ada yang benar-benar membutuhkannya. Yang harus Anda lakukan adalah (contoh 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 sebenarnya sudah ada cara yang dibangun untuk menangani ini menggunakan metode promisify Bluebird dengan meneruskan konteks untuk Bluebird untuk digunakan untuk "ini"

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

Saya tidak ingin menggunakan Bluebird sama sekali. Jika callback ke sendgrid.send () tidak tersedia, cukup kembalikan sebuah promise. Bluebird sebenarnya adalah solusi sementara

@mynameiscoffey, solusi Anda sepertinya benar.

Hai semuanya,

Mungkin sesuatu yang berguna bagi orang-orang yang menggunakan Parse dan Sendgrid bersama-sama dan telah bermigrasi ke server mereka sendiri karena Parse sedang ditutup. Ini adalah versi "Parse.Promified" dari kode @dslounge (yang saya ingin Anda

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

Halo semuanya,

Saya tidak yakin apakah masalah 'ini' tetap ada di versi baru pustaka ini, jadi saya membiarkan yang ini terbuka untuk saat ini.

Anda dapat melihat perpustakaan baru di sini: https://github.com/sendgrid/sendgrid-nodejs/tree/v3beta. Ini akan keluar dari beta dalam beberapa minggu.

Terima kasih atas dukunganmu!

Salam hangat,

Elmer

@thinkingserious apakah Anda sudah memikirkan saran @ manuel-di-iorio? Misalnya, kembalikan janji dari API Anda jika tidak ada panggilan balik yang disediakan? Itu akan menghilangkan kebutuhan untuk menggunakan janji sama sekali.

Belum @adambuczynski , tapi saya pasti terbuka untuk perbaikan perpustakaan ini.

Saat ini, kami baru saja merilis endpoint v3 / mail / send baru dari versi beta dan dalam waktu dekat kami akan memperbaiki bug yang muncul sejak peluncuran ulang semua perpustakaan kami kemarin.

Saya membiarkan tiket ini terbuka untuk pertimbangan lebih lanjut. Kami menghargai masukan tambahan yang Anda miliki!

@thinkingserious ya saya telah melihat ke dalam kode, ada beberapa perbaikan yang saya sarankan. Saya akan melihat apakah saya punya waktu untuk membuat beberapa PR untuk mereka, termasuk yang ini.

Saya telah membuat pembungkus ini untuk saat ini agar dapat bekerja dengan sendgrid dalam rantai janji:

/**
 * 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 telah menambahkan dukungan di sini: https://github.com/sendgrid/sendgrid-nodejs/issues/261

Untuk membantu memindahkannya ke atas antrian penggabungan, kita membutuhkan komentar dan +1

Terimakasih semuanya!

@thinkingserious Saya pikir Anda bermaksud menautkan ke PR, # 261 :)

@adamreisnz , satu perbaikan pada kode Anda: menurut dokumentasi, fungsi tersebut menerima kesalahan sebagai parameter pertama:

sg.API (permintaan, fungsi (kesalahan, respons) {

Bagaimanapun, terima kasih telah berbagi!

Ok, mungkin itu sudah berubah atau mungkin saya melewatkannya, terima kasih :)
Saya telah membuat pustaka pembungkus sederhana ini untuk menyederhanakan interaksi dengan paket Sendgrid: https://www.npmjs.com/package/sendgrid-mailer

Apakah halaman ini membantu?
0 / 5 - 0 peringkat