アプリケーションの構造とアプローチの一貫性を保つために、Bluebirdのpromisify関数を使用してコールバックをpromiseに変換しています。
残念ながら、sendgrid.js内で「this」を使用しているためと思われます。SendGridで「send」メソッドを約束すると「this」が未定義になるため、「api_user」をフェッチできず、メールを送信できません。 。
コールバックアプローチに戻らざるを得ないので、これは残念です。
これを使用する場合、ライブラリの内部が正しいコンテキストをバインドすることをお勧めします。または、_thisを使用します(sendgrid.js内で定義されているように見えます)。
プルリクエストを受け取った場合は、これらの修正を自分で行っていただければ幸いです。
こんにちは@antony 、
このリクエストをバックログに追加します。
はい、プルリクエストを受け付けており、変更内容を確認させていただきます。
ありがとう!
素晴らしい-ありがとう!
私はこの問題を2番目にしたかっただけです。 約束できると思っていたのですが、うまくいきませんでした。 @antonyもしあなたがその変更をすることになれば、それは私の人生を楽にするでしょう:D
ところで、誰かが本当にそれを必要とするならば、約束でsendgrid.send
を包むことは大したことではありません。 あなたがしなければならないのは(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実際には、Bluebirdが「this」に使用するコンテキストを渡すことにより、Bluebirdのpromisifyメソッドを使用してこれを処理するための組み込みの方法がすでにあります。
const Promise = require('bluebird');
const sendgrid = require('sendgrid')(sendgridKey);
const sendEmail = Promise.promisify(sendgrid.send, { context: sendgrid });
Bluebirdは一切使用したくない。 sendgrid.send()へのコールバックが提供されていない場合は、promiseを返すだけです。 Bluebirdは実際には一時的な回避策です
@mynameiscoffeyあなたの解決策は正しいもののように見えます。
やあみなさん、
ParseとSendgridを一緒に使用していて、Parseが終了しているために独自のサーバーに移行した場合に役立つかもしれません。 これが@dsloungeコードの「Parse.Promified」バージョンです(スターを付けてほしいので、1時間節約できました)。
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);
}
});
});
みなさん、こんにちは、
「この」問題がこのライブラリの新しいバージョンで持続するかどうかはわかりません。そのため、今のところこれを開いたままにしておきます。
新しいライブラリはhttps://github.com/sendgrid/sendgrid-nodejs/tree/v3betaで確認でき
ご協力ありがとうございました!
敬具、
エルマー
@thinkingserious @ manuel-di-iorioの提案について何か考えたことはありますか? たとえば、コールバックが提供されていない場合、APIからpromiseを返しますか? そうすれば、約束を完全に使用する必要がなくなります。
まだ@adambuczynskiではありませんが、このライブラリの改善には間違いなくオープンです。
現在、新しいv3 / mail / sendエンドポイントをベータ版からリリースしたばかりです。近い将来、すべてのライブラリが昨日再起動されてから発生したバグを修正する予定です。
このチケットは、さらに検討するために開いたままにしておきます。 あなたが持っている追加のフィードバックは大歓迎です!
@thinkingseriousええ、私はコードを調べました、私が提案するいくつかの改善があります。 これを含め、彼らのためにいくつかのPRを作成する時間があるかどうかを確認します。
今のところ、promiseチェーンでsendgridを操作できるように、このラッパーを作成しました。
/**
* 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
));
});
});
}
@thinkingserious PRにリンクする
@adamreisnz 、コードの1つの修正:ドキュメントによると、関数は最初の
sg.API(リクエスト、関数(エラー、レスポンス){
とにかく、共有してくれてありがとう!
わかりました、多分それは変わったか、多分私はそれを逃しました、ありがとう:)
それ以来、Sendgridパッケージとのやり取りを簡素化するために、この単純なラッパーライブラリを作成しました: https ://www.npmjs.com/package/sendgrid-mailer
最も参考になるコメント
@antony @dslounge実際には、Bluebirdが「this」に使用するコンテキストを渡すことにより、Bluebirdのpromisifyメソッドを使用してこれを処理するための組み込みの方法がすでにあります。