【问题标题】:How to properly return a response and a error from a meteor method如何从流星方法正确返回响应和错误
【发布时间】:2018-03-23 17:08:32
【问题描述】:

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

当我成功调用该方法时,我在 console.log(result); 的客户端收到 201 响应,但我还想在 POST 提交给出 400 或任何错误时通过控制台记录错误。

server/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;

  }
});

client/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);

    });
  }
});

client/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>

【问题讨论】:

    标签: javascript meteor methods error-handling return


    【解决方案1】:

    1) 您的代码当前包含竞争条件。 returnResponse 的值可以根据回调和返回语句之间的执行顺序设置也可以不设置。相反,您应该使用 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"));
            }
         });
       }); 
      }
    }
    

    【讨论】:

    • 你能给我一个代码示例吗,我读了那篇博文,让我对如何应用 Promise 有点困惑。而且我不太确定在哪里抛出新的 Meteor.Error,可能在发生错误时在 IF 语句中,感谢您迄今为止的帮助。
    • 我在您提供的任何链接中都找不到确切的解决方案“reject(new Meteor.Error)”。你能指出确切的文档吗?我刚刚自己找到了该解决方案,然后在 Google 上搜索了拒绝(新流星。错误)并找到了您的答案。我很想知道它在哪里描述
    • @quux 我正在结合两种编程实践来解释这个用例。我怀疑你会发现这些被一起提到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多