2012-04-06 32 views
1

我使用CouchDB的PHP LIB添加一個觀點:CouchDB的觀點是訪問,但將不會運行查詢

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; 
} 

在我的殼,我認爲它的文檔,以確認它的創建:

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傳遞的字符串的編碼有問題嗎?

回答

0

php的字符編碼存在一些問題。在curl中運行完全相同的查詢是成功的,並且該視圖可以正常運行

3

「EACCES」,這表明它與你的數據庫存儲在該目錄的權限或所有權問題。

對於每個數據庫,數據庫服務器將創建一個子目錄包含每個設計文檔的文件名爲.<db_name>_design在那個數據庫裏。很可能您的CouchDB實例正在運行的用戶沒有創建該目錄的權限,或者可能是其中的文件。

檢查您的數據庫所在的目錄及其下的所有目錄是否由您的CouchDB運行的用戶所擁有,並且目錄和文件具有合理的權限。如果你是從源代碼安裝的,它是/ usr/local/var/lib/couchdb,但如果你使用了一個包,它可能會不同。

+0

沙發以root用戶身份運行。另外,當我刪除視圖並直接從curl請求重新添加它時,它是功能性的。也許php-curl以某種方式創建了具有錯誤權限的文件 – Kristian 2012-04-06 13:51:50

+0

有趣的是 - 我的解釋似乎與CouchDB以root身份運行的事實不一致。我很高興它正在工作,但從查詢視圖的時間和上面的錯誤中看到couch.log仍然很有趣。我不知道php-curl可能導致'.view'文件被創建的權限錯誤,所以我不認爲這是你的解釋。 – 2012-04-06 19:02:09

+0

我認爲它確實必須與php的char編碼curl請求的方式有關......因此強制map函數並非真的是它的樣子......因爲直接在shell中運行相同的視圖PUT請求完美的作品。 – Kristian 2012-04-06 19:25:24