通过ajax调用CouchDB时收到空响应

4

我是CouchDB的新手,请多包涵。

我有一个CouchDB实例运行在虚拟机上。我可以通过Futon或者直接访问浏览器访问它:

http://192.168.62.128:5984/articles/hot_dog

在浏览器中调用该URL返回正确的JSON。但是,当我尝试通过ajax调用完全相同的URL时,什么也没有返回:

var ajaxUrl = 'http://192.168.62.128:5984/articles/hot_dog';
$.getJSON(ajaxUrl, null, function(data) { alert(data); });

通过Firebug查看响应头,我发现HTTP响应是200,而content-length也是正确的大小。甚至Etag与CouchDB中的匹配。但是响应本身是空的!URL绝对正确;我已经三次检查并直接复制/粘贴它(如果不正确,它不会给出200响应)。我正在使用jQuery 1.4.2和CouchDB 0.8。发生了什么事?
4个回答

5
尝试在url后面添加callback=?。这将触发jQuery发出一个jsonp请求。
var ajaxUrl = 'http://192.168.62.128:5984/articles/hot_dog?callback=?';

如果这样做无法解决问题,您还应该在浏览器中附加此URL返回的JSON示例输出。

好的,这个加上升级到couch 0.10.1就行了。谢谢!但我还是不明白为什么会这样...为什么没有?callback=?后缀就不能用ajax调用呢? - swilliams
1
根据您在问题中的描述,我认为这不是跨域请求问题(由虚拟机内部(使用不同端口)或外部的Web服务器提供的内容都将被视为跨域请求,并且应该被浏览器阻止)。添加“callback”内容使其成为“jsonp”请求,基本上这只是一个猜测,因为我不熟悉CouchDB,所以不知道为什么如果不存在跨域请求,则无法使用纯json请求。正如您提到的“升级”,我注意到(通过谷歌搜索)jsonp支持仅从版本0.10开始,因此升级是正确的做法。 - jitter

5
当您尝试从其他Web服务器获取数据时,需要执行JSONP查询以与HTML文件一起使用。首先,在最新版本的CouchDB中,您需要在配置(.ini)文件中启用JSONP查询。(自CouchDB 1.0以来,默认情况下已禁用)在[httpd]部分中,您需要添加一个

allow_jsonp = true

完成此操作后,您可以在CouchDB上生成JSONP查询。
然后,在jQuery中,您需要将?callback=?添加到URL中以触发JSONP查询。
祝大家跨域资源共享愉快。

为什么jsonp总是解决跨域问题的答案?这是一个可以接受的短期解决方案,但对于良好的REST实践来说,从长远来看并不是一个好的选择。 - Justin
同意Justin的观点,CORS变得荒谬了。但是Loomi:CouchDB服务器如何“允许”jsonp?它不知道浏览器用什么来发出请求——jsonp只是一个GET。或者这个选项是否允许进行伪PUT(JSONP无法实现的)? - Marc

2
听起来你正在尝试进行跨域的AJAX请求,这会被浏览器拒绝。为了解决这个问题,你可以像上面的答案一样使用JSONP,但是这将限制你只能使用GET请求;你无法添加、修改或删除记录。
如果你想要在CouchDB中进行跨域的AJAX调用,我建议你查看这个库:

http://github.com/benvinegar/couchdb-xd


你绝对是正确的,这是一个跨域问题。最终,我使用了一个叫做CouchApp的库,将所有的代码包装成附件放在couchdb中,因此不再有跨域问题。不过我也会研究一下你的库。既然你比jitter“更”正确(而且他有足够的声望:-p),我将你的回答标记为答案。谢谢! - swilliams

-2

首先这是一个关于 JSON 的问题,您已经标记了 jQuery...

如果您需要 jQuery,那么请查找 load() 函数。

$('#selector').load(ajaxURL); alert($('#selector').html())


你所说的完全是错误的。他明显使用了jQuery,这可以从他使用$.getJSON看出。对于他想要的内容,load函数也绝对不是正确的选择。因此,这个问题标记得很正确,只是缺少了json标签。 - jitter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接