Parse Cloud Code Mandrill Promise

Итак, у меня проблема с переходом с Mailgun и переходом на Mandrill. Я следовал руководству по применению Parse Purchase, и у меня очень похожая кодовая база. Вот что это в настоящее время и успешно работает.

return Mailgun.sendEmail({
    to: currentUser.get('email'),
    from: hostEmail,
    subject: 'Your ticket(s) purchase for ' + eventObject.get('title') + ' was successful!',
    text: body
}).then(null, function(error) {
    return Parse.Promise.error('Your purchase was successful, but we were not able to send you an email.');
});

Так что это работает успешно, никаких ошибок не выдается.

Итак, вот эквивалент Mandrill,

return Mandrill.sendEmail({
    message: {
        text: body,
        subject: 'Your ticket(s) purchase for ' + eventObject.get('title') + ' was successful!',
        from_email: hostEmail,
        from_name: appname,
        to: [{
            email: currentUser.get('email'),
            name: currentUser.get('displayName')
        }]
    },
    async: true
}).then(null, function(error) {
    console.log('Sending email failed. Error: ' + error);
    return Parse.Promise.error('Your purchase was successful, but we were not able to send you an email.');
});

Судя по всему, это не работает.

Журнал ошибок показывает:

Error: TypeError: Cannot read property 'success' of undefined
at Object.exports.sendEmail (mandrill.js:55:21)
at main.js:115:25
at e (Parse.js:2:6670)
at Parse.js:2:6119
at Array.forEach (native)
at Object.x.each.x.forEach [as _arrayEach] (Parse.js:1:661)
at c.extend.resolve (Parse.js:2:6070)
at Parse.js:2:6749
at e (Parse.js:2:6670)
at Parse.js:2:6119 (Code: 141, Version: 1.6.0)

Итак, я думаю, что Mandrill успешно отправляет электронное письмо, потому что он ищет свойство «успех», но обещание всегда терпит неудачу и возвращает ответ об ошибке обратно в приложение iOS.

Любая помощь будет оценена!

Спасибо еще раз


person jsetting32    schedule 17.03.2015    source источник
comment
Вы уверены, что Mandrill вообще поддерживает обещания? Кажется, он ищет обратный вызов success.   -  person Bergi    schedule 17.03.2015
comment
Вы действительно хотите async: false?   -  person Bergi    schedule 17.03.2015
comment
@ Берги Нет. Не знаю. Это был мой плохой ха-ха. Это в основном остановит весь сервер, пока процесс не будет завершен. Это было бы плохо! Это правильно? Почему они вообще дали нам этот вариант?   -  person jsetting32    schedule 17.03.2015
comment
@Bergi, мне удалось найти ссылку, которая интегрирует Promises с Mandrill sendMail здесь, gist.github.com/ ardrian/dcb47afeb59cad0234eb . Я опубликую правку   -  person jsetting32    schedule 17.03.2015
comment
Ну, я думаю, что это ответ, а не редактирование…   -  person Bergi    schedule 17.03.2015
comment
Возможно, это просто проблема с копированием/вставкой, но в вашем коде есть синтаксическая ошибка (об этом свидетельствует цвет текста в последней строке).   -  person JLRishe    schedule 17.03.2015
comment
@JLRishie Это было просто редактирование, которое я сделал в сообщении, чтобы скрыть фактическое сообщение, которое показывает электронное письмо поддержки.   -  person jsetting32    schedule 17.03.2015
comment
И @Bergi, ты был прав. Это был ответ :)   -  person jsetting32    schedule 17.03.2015


Ответы (1)


Нашел проблему. Очевидно, вам нужно объявить переменную обещания и отправить ей обратные вызовы успеха/неудачи.

Основная ссылка, которую я разместил в комментариях, помогла мнеосновная ссылка

Вот что я делаю сейчас,

Parse.Cloud.define('purchase', function(request, response) { 
    ...

    ...

    ...

    var message = {
            text: body,
            subject: 'Your ticket(s) purchase for ' + eventObject.get('title') + ' was successful!',
            from_email: hostEmail,
            from_name: appname,
            to: [{
                email: currentUser.get('email'),
                name: currentUser.get('displayName'),
            }]
        };

    return sendMandrillEmailPromise(message).then(null, function(error) {
        console.log('Sending email failed. Error: ' + error);
        return Parse.Promise.error('Your purchase was successful, but we not able to send you an email');
    ...

    ...

    ...  
});

var sendMandrillEmailPromise = function(message){
    var promise = new Parse.Promise();
    Mandrill.sendEmail({
        message: message,
        async: true,
    },{
        success: function(httpResponse) {
            promise.resolve(httpResponse);
        },
        error: function(error) {
            promise.error(error);
        }
    });
    return promise;
}

Работает, как и ожидалось, и я получил УДИВИТЕЛЬНОЕ электронное письмо! Спасибо, ребята, за ваш вклад!

person jsetting32    schedule 17.03.2015
comment
Конечно, вы можете отправить отчет об ошибке в Mandrill, будут ли они поддерживать промисы из коробки :-) - person Bergi; 17.03.2015
comment
Звучит как план! Сделаю - person jsetting32; 17.03.2015