为啥客户端 HTTP.get() 调用在 Cordova (Meteor 0.9.3) 中不起作用?

Posted

技术标签:

【中文标题】为啥客户端 HTTP.get() 调用在 Cordova (Meteor 0.9.3) 中不起作用?【英文标题】:Why isn't a client-side HTTP.get() call working in Cordova (Meteor 0.9.3)?为什么客户端 HTTP.get() 调用在 Cordova (Meteor 0.9.3) 中不起作用? 【发布时间】:2014-09-28 21:06:32 【问题描述】:

更新的问题: 一个简单的客户端 HTTP.get() 调用在 ios 模拟器上不起作用。相同的调用正在获取数据并在浏览器的模板中完美显示(localhost:3000) 早些时候我认为这与本地集合有关,但问题实际上出在 HTTP.get 调用上,它没有返回cordova(ios 模拟器或设备)中的任何数据。

请注意,我的整个代码仅在客户端 if (Meteor.isClient) 中,而在 if (Meteor.isCordova) 中没有任何内容。

原始问题:是否可以在 Cordova (Meteor 0.9.3) 中定义本地集合? 我的应用中有一个本地(仅限客户端)集合,如图所示: Items = new Meteor.Collection(null);

此本地集合临时从外部 API 获取数据(通过添加 'meteor add http' 并使用 HTTP.get() )并将此内容推送到模板。这通过帮助程序(return Items.find())完美地出现在 localhost:3000 上的浏览​​器模板中,但是当我运行“meteor run ios”时,iOS 模拟器中没有加载数据。

首先,是否有可能期望本地集合在 Cordova 中工作? 这是否应该在内部定义: Meteor.isCordova( )? 是否需要添加特定于科尔多瓦的软件包? 我相信在这种情况下本地集合是必要的,因为数据是根据用户的设备位置检索的,并且仅与当前会话相关。

任何想法都将不胜感激。

(这里是流星菜鸟,如果这听起来很愚蠢,请见谅!)

编辑:在服务器和客户端上定义的集合在浏览器和 iOS 模拟器上都可以工作。所以问题只出在本地集合上。

【问题讨论】:

我不认为 Cordova 和本地收藏有什么特别之处。您可能还有其他一些错误,例如未连接到服务器或没有 CORS 标头与外部服务通信,因为 cordova 代码来自不同的来源。 @imslavko 抱歉,我应该提到我能够访问在 iOS 模拟器中的服务器和客户端上定义的集合(就像在我的文件夹结构中的一个常见的“集合”文件夹中)。这意味着我的应用程序的cordova 部分运行正常。此外,CORS 标头由 Chrome 浏览器插件处理。所以我有理由确定它只有在使用本地集合时才会出现问题。 不知道你说的Chrome浏览器插件是什么。 @imslavko 它是一个 chrome 扩展,可让您启用/禁用 CORS。这是一个:link 【参考方案1】:

@imslavko 你确实是对的!它是我进行 API 调用的服务器上的 CORS 问题。 经过几天的努力,我最终发现服务器没有 Access-Control-Allow-Origin: * 用于简单的 GET/POST 请求。

感谢您帮助解决这个问题。

所以事实证明 Cordova 与此无关。所有 HTTP.get() 调用都可以在 Cordova 中完美运行,包括本地集合。

【讨论】:

【参考方案2】:

还有一个技巧需要注意。

HTTP.get('/route') 可能最终会出现在手机本地服务器中,而不是数据来源的远程服务器中 - 因此您不会收到您期望的数据。

改为使用

HTTP.get(__meteor_runtime_config__.ROOT_URL + '/route')

因为 ROOT_URL 变量在 Cordova 应用程序和普通浏览器中都指向正确的服务器。

【讨论】:

以上是关于为啥客户端 HTTP.get() 调用在 Cordova (Meteor 0.9.3) 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Boehm GC 附带的“cord”库导致未定义的引用错误

C++ 套接字:当客户端调用 connect() 时,accept() 挂起,但 accept() 响应 HTTP GET 请求

为啥 on_message 会停止命令工作?

为啥我们更喜欢在角度中使用 $q 而不是 $http [重复]

如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

为啥 http.get 不能再使用字符串了? [复制]