Javascript 为什么我的Meteor API调用引发异常?
我有以下代码(基于“”中的242页和243页)来尝试调用外部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)
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 doJSON.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调用成功。