如何从流星方法中正确返回响应和错误

时间:2017-10-11 21:52:50

标签: javascript meteor methods error-handling return

我试图从服务器端存在的流星方法返回客户端的响应或错误。该方法本身用于在提交表单时向API提交发布请求,我希望在客户端能够返回API的响应,以便我可以向用户发送信息,例如,此电子邮件地址已经存在。这是我到目前为止所拥有的。

当我在成功调用方法时,我在console.log(result);的客户端收到201响应,但我想在POST提交给出400或任何错误时控制日志错误。< / p>

服务器/ main.js

Meteor.methods({
  addSub(email) {

  var emailAddress = {
      "lists": [
        {
          "id": "1395617465"
        }
      ],
      "email_addresses": [
        {
          "email_address": email
        }
      ]
    }

    HTTP.post('https://api.constantcontact.com/v2/contacts?api_key=<api-key>', {
      headers: {
          'Authorization': 'Bearer <token>',
          'Content-Type': 'application/json'
        },
        data: emailAddress
        }, function (error, response) {
          if ( error ) {
            console.log( error );
            throwError = error;
          } else {
            console.log(response);
            returnResponse = response;            
          }
    });

    return returnResponse;

  }
});

的客户机/ main.js

Template.info.events({
  'submit #cm-subscribe'(event){
    event.preventDefault();
    var form = event.target;
    var email = form.email.value;
    Meteor.call('addSub', email, (error, result) => { 

        console.log(result);

    });
  }
});

的客户机/ main.html中

<template name="info">
  <h2>Signup For Our Newsletter</h2>

  <form id="cm-subscribe">

    <input field name="email" type="email" value="email">

    <input type="submit">
  </form>

</template>

1 个答案:

答案 0 :(得分:4)

1)您的代码目前包含竞争条件。 returnResponse的值可以设置也可以不设置,具体取决于回调和return语句之间的执行顺序。相反,您应该使用Promises,它允许您以同步方式包装异步代码。关于如何做到这一点,有一篇很好的帖子on the Meteor blog。请注意,这不会影响客户端行为 - 它仍然会像您一样使用回调。

2)您在客户端上看不到错误的原因是Meteor故意将所有正常的Javascript错误(如HTTP.post返回的错误)转换为内部服务器错误以保护数据和源代码。您应该做的是处理服务器端的所有错误,并返回新的Meteor.Error对象以获得预期的无效响应。然后可以由客户端处理这些。可以在Meteor Guide.

中找到对此的详尽解释

这样的事情:

Meteor.methods({
  addSub(email) {

   return new Promise((resolve, reject) => {
     HTTP.post('<URL>', ..., function(error, response){
        if(!error){
           resolve(response);
        } else if (error == <Some Error Comparison>){
           reject(new Meteor.Error("Email.subscription.invalidEmail", "You put in an invalid email"));
        }
     });
   }); 
  }
}