解析云代码 Mandrill Promise

Posted

技术标签:

【中文标题】解析云代码 Mandrill Promise【英文标题】:Parse Cloud Code Mandrill Promise 【发布时间】:2015-05-20 04:05:01 【问题描述】:

所以我在从 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 成功发送电子邮件是因为它正在搜索“成功”属性,但 Promise 总是失败并返回错误响应给 ios 应用程序。

任何帮助将不胜感激!

再次感谢

【问题讨论】:

你确定 Mandrill 完全支持 Promise 吗?它似乎在寻找success 回调。 你真的想要async: false吗? @Bergi 不,我没有。那是我的错哈哈。这基本上会停止整个服务器,直到该过程完成。那会很糟糕!那正确吗?他们为什么要给我们这样的选择? @Bergi,我在这里找到了一个将 Promises 与 Mandrill sendMail 集成的链接,gist.github.com/ardrian/dcb47afeb59cad0234eb。我会发布编辑 嗯,我认为这是一个答案而不是编辑...... 【参考方案1】:

发现问题。显然,您必须实际声明一个 promise 变量并向其发送成功/失败回调。

我在 cmets 中发布的要点链接对我有帮助gist Link

这就是我现在所做的,

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;

按预期工作,我收到了一封很棒的电子邮件!谢谢大家的意见!

【讨论】:

当然,您可能想向 Mandrill 提交错误报告,无论他们是否支持开箱即用的 Promise :-) 听起来像个计划!会做

以上是关于解析云代码 Mandrill Promise的主要内容,如果未能解决你的问题,请参考以下文章

部署代码以解析云时出错

带有解析服务器的 Mandrill 无法进行 heroku 迁移

如何在解析云代码中将文本文件附加到山魈邮件?

Mandrill 电子邮件卡在排队中

使用带有 Promises 的嵌套云代码函数时出现 ParseError

Firebase 云函数 - 返回未定义、预期的 Promise 或值