CouchDB 视图可访问,但不会运行查询

Posted

技术标签:

【中文标题】CouchDB 视图可访问,但不会运行查询【英文标题】:CouchDB view is accessible, but won't run query 【发布时间】:2012-04-06 02:09:02 【问题描述】:

我使用了 couchdb 的 php 库来添加视图:

public function addView() 
    $design_doc = new stdClass();
    $design_doc->_id = '_design/need';
    $design_doc->language = 'javascript';
    $design_doc->views = array( 'all' => array('map' => "function(doc)  if (doc.type == 'need')  emit(doc.type, doc) " ) );
    $result = $this->client->storeDoc($design_doc);
    return $result;

在我的 shell 中,我查看了它的文档以确认它已创建:

curl -X GET mysite.com/bids/_design/need

  "_id":"_design/need",
  "_rev":"1-0ed4b41b839ade9ca36fb950cac1c39b",
  "language":"javascript",
  "views":
    
      "all":
        
          "map":"function(doc)  if (doc.type == 'need')  emit(doc.type, doc) "
        
    

然后在尝试实际执行视图时,它会抛出 eacces 错误:

curl -X GET mysite.com/bids/_design/need/_view/all

  "error":"error","reason":"eacces"

权限:实例以 root 身份运行。

我是否使用了错误的语法来执行视图查询?

会不会是通过 PHP 传递的字符串的编码有问题?

【问题讨论】:

【参考方案1】:

“eacces”表示存储数据库的目录的权限或所有权存在问题。

对于每个数据库,数据库服务器将创建一个名为.<db_name>_design 的子目录,其中包含该数据库中每个设计文档的文件。运行您的 CouchDB 实例的用户可能无权创建该目录或其中的文件。

检查您的数据库所在的目录及其下的所有内容是否归您运行 CouchDB 的用户所有,并且这些目录和文件是否具有合理的权限。如果您从源代码安装,则为 /usr/local/var/lib/couchdb,但如果您使用包,则可能会有所不同。

【讨论】:

沙发以 root 身份运行。此外,当我删除视图并直接从 curl 请求重新添加它时,它就可以正常工作了。也许 php-curl 以某种方式创建了具有错误权限的文件 有趣 - 我的解释似乎与 CouchDB 以 root 身份运行的事实不一致。我很高兴它可以正常工作,但是从您查询视图并收到上述错误时开始查看 couch.log 仍然会很有趣。我不知道 php-curl 会导致使用错误的权限创建 .view 文件,所以我认为这不是你的解释。 我认为它确实必须与 php 对其 curl 请求进行 char 编码的方式有关......因此迫使 map 函数不是它看起来的样子......因为运行直接在 shell 中的相同视图 PUT 请求完美运行。【参考方案2】:

php 的字符编码存在一些问题。在 curl 中运行完全相同的查询是成功的,然后视图能够正常运行

【讨论】:

以上是关于CouchDB 视图可访问,但不会运行查询的主要内容,如果未能解决你的问题,请参考以下文章

从 couchdb 视图访问会话信息

couchdb 查询地图视图而不是减少视图

如何在 CouchDB 中创建 Erlang 视图

来自 Ektorp 的 CouchDB Map/Reduce 视图查询

如何使用 javascript 在 couchdb 中使用多个组合键进行查询,而无需为每个组合编写单独的视图?

关于带有 couchDB 视图的“无效 JSON”的错误,但 json 很好