将来自服务器的回调集成到流星/节点方法中

时间:2016-08-01 21:22:44

标签: javascript node.js meteor

需要一些帮助来升级处理简报订阅者的方法,但不知道该怎么做。基本上我希望能够在出现错误(或正确)的情况下从Mailchimp服务器捕获响应,以便能够处理它。

以下是代码:

Meteor.methods({
subscribeToMailchimp:function(subscriberMail){

mailchimp.request({
  method : 'POST',
  path : Path,
  body : {
    "email_address": subscriberMail,
    "status": "subscribed"
  }

});

return true;

} });

所以根据npm模块的文档:https://www.npmjs.com/package/mailchimp-api-v3和他的例子:

mailchimp.request({
method : 'get|post|put|patch|delete',
path : 'path for the call, see mailchimp documentation for possible calls'
path_params : {
 //path parameters, see mailchimp documentation for each call 
}
body : {
//body parameters, see mailchimp documentation for each call 
},
query : {
//query string parameters, see mailchimp documentation for each call 
}
}, callback)

...如果我理解的话,我应该能够实现一些回调。有人能指出我正确的方向来抓住这个回应吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

在回调中使用err和结果对象

Meteor.methods({
  subscribeToMailchimp: function(subscriberMail){

    mailchimp.request({
      method : 'POST',
      path : Path,
      body : {
        "email_address": subscriberMail,
        "status": "subscribed"
      }
    },function(err, results){ //here you can handle response 
      if(err){
        console.log(err);
      }else{
        console.log(results);
      }  
    });            
  }
});

答案 1 :(得分:1)

总结其他答案,完整的代码片段看起来像这样(我无法测试这个特定的请求,但我认为你明白了这一点):

Meteor.methods({
  subscribeToMailchimp: function(subscriberMail){
    return Meteor.wrapAsync(function(callback) {    
      mailchimp.request({
        method : 'POST',
        path : Path,
        body : {
          "email_address": subscriberMail,
          "status": "subscribed"
        }
      }, function(err, results) {
        if (err) {
          callback(err, null);
        } else {
          callback(null, results);
        }  
      });
    })();
  }
});

答案 2 :(得分:0)

如果要将远程服务(在这种情况下为Mailchimp)的实际响应(错误/结果)发送到客户端,则必须使服务器Meteor方法“挂断”,等待异步远程服务要求完成,然后才能让你的方法返回。

否则,该方法将启动(异步)请求并继续执行,即返回(因为方法中没有更多指令),因此调用客户端Meteor调用的回调。远程服务请求完成后,Meteor调用已完成,只有您的服务器可以执行某些处理。

您可以使用Meteor.wrapAsync()包装异步请求,也可以在等待远程服务响应时让其他Meteor方法处理之前添加this.unblock()

另请参阅:Throwing Meteor.Error does not reach the client