Javascript 为什么我的Meteor API调用引发异常?

Javascript 为什么我的Meteor API调用引发异常?,javascript,json,meteor,http-get,http-error,Javascript,Json,Meteor,Http Get,Http Error,我有以下代码(基于“”中的242页和243页)来尝试调用外部API: 流星法: Meteor.methods({ . . . 'getTextAddrAsEmailAddr': function(phone) { this.unblock; var apiUrl = 'http://www.xminder.com/number.check.php?number=' + phone; var response = Meteor.wrapAsync(apiCall)

我有以下代码(基于“”中的242页和243页)来尝试调用外部API:

流星法:

Meteor.methods({
  . . .
  'getTextAddrAsEmailAddr': function(phone) {
    this.unblock;
    var apiUrl = 'http://www.xminder.com/number.check.php?number=' + phone;
    var response = Meteor.wrapAsync(apiCall) (apiUrl);
    return response;
  }
});
“专用功能”:

我如何调用它(一个Meteor方法调用另一个):

(Chrome)浏览器控制台输出:

reached addPerson.submit form
methods.js:29 insertPerson reached
methods.js:41 phone is 2624908739
debug.js:41 Exception in callback of async function Error: Cannot access the API [500]
    at apiCall (http://localhost:3000/app/both/methods.js?55690625ac0aa28550112db1c63d2b8912cc3410:30:19)
    at http://localhost:3000/packages/meteor.js?9730f4ff059088b3f7f14c0672d155218a1802d4:195:23
    at Meteor.methods.getTextAddrAsEmailAddr (http://localhost:3000/app/both/methods.js?55690625ac0aa28550112db1c63d2b8912cc3410:82:45)
    at http://localhost:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:3911:25
    at _.extend.withValue (http://localhost:3000/packages/meteor.js?9730f4ff059088b3f7f14c0672d155218a1802d4:971:17)
    at _.extend.apply (http://localhost:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:3902:54)
    at _.extend.call (http://localhost:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:3780:17)
    at Meteor.methods.insertPerson (http://localhost:3000/app/both/methods.js?55690625ac0aa28550112db1c63d2b8912cc3410:52:38)
    at http://localhost:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:3911:25
    at _.extend.withValue (http://localhost:3000/packages/meteor.js?9730f4ff059088b3f7f14c0672d155218a1802d4:971:17)
methods.js:50 textAddrAsEmailAddr is undefined
methods.js:51 undefined
methods.js:53 textAddrAsEmailAddr is undefined
命令提示符输出:

I20151024-07:23:43.999(-7)? insertPerson reached
I20151024-07:23:44.021(-7)? phone is 2624908739
I20151024-07:23:44.641(-7)? textAddrAsEmailAddr is undefined
I20151024-07:23:44.649(-7)? null
I20151024-07:23:44.649(-7)? textAddrAsEmailAddr is undefined
结果是,我的专用函数的catch块被击中了。为什么?我可以直接在浏览器中输入ApiUrl(),并得到以下结果:

{"success":true,"data":{"number":"2624908739","status":"YES","carrier_name":"ATT Mobility","carrier_id":"","sms_address":"2624908739@txt.att.net","mms_address":"2624908739@mms.att.net"}}
我想要sms_地址值,特别是;为什么访问此响应的尝试失败

更新 我将代码更改为:

var apiCall = function (apiUrl, callback) {
  try {
    var response = HTTP.get(apiUrl).data;
    callback(null, response);
  }
  // catch (error) {
  //   if (error.response) {
  //     var errorCode = error.response.data.code;
  //     var errorMessage = error.response.data.message;
  //   }
  //   else {
  //     // var errorCode = 500;
  //     var errorCode = error.response.code;
  //     // var errorMessage = 'Cannot access the API';
  //     var errorMessage = error.response.message;
  //   }
  //   var myError = new Meteor.Error(errorCode, errorMessage);
  //   callback(myError, null);
  // }
  catch (error) { console.log(error) };
}
…并在命令提示符控制台中获得相同的结果:

I20151024-08:14:57.413(-7)? insertPerson reached
I20151024-08:14:57.434(-7)? phone is 2624908741
I20151024-08:14:58.248(-7)? textAddrAsEmailAddr is undefined
I20151024-08:14:58.255(-7)? null
I20151024-08:14:58.264(-7)? textAddrAsEmailAddr is undefined
I20151024-13:02:23.539(-7)? insertPerson reached
I20151024-13:02:23.563(-7)? phone is 2624908743
I20151024-13:02:24.399(-7)? textAddrAsEmailAddr is undefined
I20151024-13:02:24.409(-7)? null
I20151024-13:02:24.410(-7)? textAddrAsEmailAddr is undefined
=> Errors prevented startup:

   While processing files with ecmascript (for target os.windows.x86_32):
   server/methods.js:4:54: server/methods.js: Unexpected token (4:54)

=> Your application has errors. Waiting for file change.
…在浏览器控制台中:

reached addPerson.submit form
methods.js:25 insertPerson reached
methods.js:37 phone is 2624908741
methods.js:20 Error: Can't make a blocking HTTP call from the client; callback required.(…)
methods.js:46 textAddrAsEmailAddr is undefined
methods.js:47 undefined
methods.js:49 textAddrAsEmailAddr is undefined
reached addPerson.submit form
注意:我在将挡块更改为:

catch (error) {
  console.log(error)
  callback(error, null);
};
更新2 无论如何,尝试使用此特定API可能是一个失败的原因,因为在浏览器中测试假电话号码会:

{"success":false,"error":"Too many requests during last 24h"}
更新3 我将Meteor方法从\eath\文件夹移动到\server\文件夹,但显然没有什么用处。我在浏览器控制台中仅获得以下信息:

reached addPerson.submit form
methods.js:25 insertPerson reached
methods.js:37 phone is 2624908741
methods.js:20 Error: Can't make a blocking HTTP call from the client; callback required.(…)
methods.js:46 textAddrAsEmailAddr is undefined
methods.js:47 undefined
methods.js:49 textAddrAsEmailAddr is undefined
reached addPerson.submit form
…这(仍然/再次)在命令提示控制台中:

I20151024-08:14:57.413(-7)? insertPerson reached
I20151024-08:14:57.434(-7)? phone is 2624908741
I20151024-08:14:58.248(-7)? textAddrAsEmailAddr is undefined
I20151024-08:14:58.255(-7)? null
I20151024-08:14:58.264(-7)? textAddrAsEmailAddr is undefined
I20151024-13:02:23.539(-7)? insertPerson reached
I20151024-13:02:23.563(-7)? phone is 2624908743
I20151024-13:02:24.399(-7)? textAddrAsEmailAddr is undefined
I20151024-13:02:24.409(-7)? null
I20151024-13:02:24.410(-7)? textAddrAsEmailAddr is undefined
=> Errors prevented startup:

   While processing files with ecmascript (for target os.windows.x86_32):
   server/methods.js:4:54: server/methods.js: Unexpected token (4:54)

=> Your application has errors. Waiting for file change.
…但Jeroen Peeter的代码与我的代码不同,我不知道如何将其合并到我现有的代码中;他说:

HTTP.get(apiUrl, function (error, data){
    console.log( 'http.get ::', error, data);
});
…我有:

var apiCall = function (apiUrl, callback) {
  try {
    var response = HTTP.get(apiUrl).data;
    callback(null, response);
  }
  catch (error) {
    if (error.response) {
      var errorCode = error.response.data.code;
      var errorMessage = error.response.data.message;
    }
    else {
      var errorCode = error.response.code;
      var errorMessage = error.response.message;
    }
    var myError = new Meteor.Error(errorCode, errorMessage);
    callback(myError, null);
  }
…那么他的代码在哪里与我的(非工作)代码相匹配

更新4 更改此项后:

var response = HTTP.get(apiUrl).data;
……为此:

var response = JSON.parse(HTTP.get(apiUrl).content;
…在命令提示符控制台中,我得到:

I20151024-08:14:57.413(-7)? insertPerson reached
I20151024-08:14:57.434(-7)? phone is 2624908741
I20151024-08:14:58.248(-7)? textAddrAsEmailAddr is undefined
I20151024-08:14:58.255(-7)? null
I20151024-08:14:58.264(-7)? textAddrAsEmailAddr is undefined
I20151024-13:02:23.539(-7)? insertPerson reached
I20151024-13:02:23.563(-7)? phone is 2624908743
I20151024-13:02:24.399(-7)? textAddrAsEmailAddr is undefined
I20151024-13:02:24.409(-7)? null
I20151024-13:02:24.410(-7)? textAddrAsEmailAddr is undefined
=> Errors prevented startup:

   While processing files with ecmascript (for target os.windows.x86_32):
   server/methods.js:4:54: server/methods.js: Unexpected token (4:54)

=> Your application has errors. Waiting for file change.

第4行,char 54是“content”中的最后一个“t”…?

似乎HTTP.get是从客户端而不是服务器上运行的。在这种情况下,无法阻止调用,因此会显示错误消息。您需要定义一个回调:

HTTP.get(apiUrl, function (error, data){
    console.log( 'http.get ::', error, data);
});
如果您不想在客户机上运行它(我认为您不想这样),那么您需要确保您的方法是在服务器上定义的。 将定义Meteor.methods的文件放在
server
文件夹中,或使用
if(Meteor.isServer){…}
包装所有Meteor.methods,以确保这些方法仅在服务器上定义

if (Meteor.isServer) { 
    Meteor.methods({
    . . .
    'getTextAddrAsEmailAddr': function(phone) {
        this.unblock;
        var apiUrl = 'http://www.xminder.com/number.check.php?number=' + phone;
        var response = Meteor.wrapAsync(apiCall) (apiUrl);
        return response;
    }
});

使用Meteor.wrapAsync进行外部API调用的方式有问题

以下是我将如何做到这一点(在ECMAScript 2015中)


请确保将上面的所有代码都放在服务器文件夹中,或者用
if(Meteor.isServer){…}

将错误记录在catch子句中。现在您自己将错误代码设置为500。我不知道实际的错误是什么。请记录错误并将其发布到此处。好的,我不知道具体如何操作,但将尝试将error.response.code分配给errorCode,将error.response.message分配给errorMessage。只需执行以下操作:…}捕获(错误){console.log(错误);…..,并用错误消息更新您的问题。好的,谢谢;我已将它从两者都移动到服务器,稍后将重试。请尝试
HTTP.get(apirl).content
而不是
.data
.Node(和Meteor)使用内容类型标题确定数据类型。在本例中,内容类型为text/html,因此不会尝试将其解析为JSON,因此
.data
为空。如果您确定API始终返回JSON do
JSON.parse(HTTP.get(apirl).Content)
Dude,你少了一个右括号!!你知道如何编写javascript吗?如果不知道,一定要先开始学习。另外,我给了你正确的一行括号,所以要更加努力地正确复制粘贴。我觉得这样做是在浪费大家的时间!我尝试了这些更改,但在f上仍然失败这一行的最后一个“t”:var response=JSON.parse(HTTP.get(apirl).content;您不需要使用var response=JSON.parse(HTTP.get(apirl).content;此外,上面的答案是让API调用工作所需的全部。解决方案对您有效吗?我已经在我的计算机上测试过,API调用工作正常不,我从来没有让它工作过,但对我来说这是一个没有意义的点,正如前面提到的,因为API在24小时内只接受这么多请求。不过,我相信你的话,它是有效的,并将其标记为正确答案。即使您超出了API的请求限制,它仍将返回某种类型的响应,指示API调用成功。