2010-11-12 48 views
6

我一直在玩CouchDB和CouchApp一段時間。我打算將它用於我正在開發的一個新的網站項目。沒有服務器端的CouchApp或帶有xdomain問題的CouchDB後端?

  1. 從可擴展性的角度來看,我喜歡CouchApp的想法。

    缺點是,沒有服務器端代碼,有一些事情(如oAuth認證),很難做到客戶端。在某些時候,我確定我需要一些描述的服務器端代碼 - 我想你可以看看Node.js,但不想在這一點上。

  2. 將CouchDB純粹用作後端解決方案,而您的頁面是從另一臺服務器提供的,這也非常適合,但其缺點是跨域問題會阻止您輕鬆使用內置的CouchDB API。

那麼,有沒有人有解決這兩個缺點之一?

你能以某種方式從CouchApp服務器端代碼(即使PHP將是一個勝利),或者你可以以某種方式使用單獨的網站爲您的網頁提供服務,但克服了跨域問題?

我真的試圖保持解決方案儘可能乾淨(和可擴展性),並且關於CouchDB的一件偉大的事情是超級簡單,超級快的API,所以我並不想在它周圍使用包裝 - 除非它不妨礙性能/可擴展性。

歡迎您的意見。

回答

14

由於CouchDB使用基於HTTP的API,因此可以通過多種方式將服務器端代碼(node.js,PHP等)與您的CouchApp「混合搭配」。

我將選項分爲三類:

  1. 首先,2層架構是你現在擁有的一切:瀏覽器+ CouchApp從CouchDB的服務。對於只需要瀏覽器和CouchDB可提供的應用程序而言,這是一個很好的解決方案,但只要您需要發送電子郵件,調整圖像大小或從其他數據庫獲取數據有一個HTTP API(MySQL,MongoDB等)。
  2. 接下來,是3層體系結構:瀏覽器+ Apache/PHP(或類似的堆棧)+ CouchDB。這是更「傳統」的選擇(即LAMP)。這對於逐步遷移到CouchDB是很好的,但是從長遠來看,通過第二個HTTP服務器(可能是代理)或者像PHP這樣的服務器端腳本語言來傳遞所有內容會非常麻煩。
  3. 最後和我最喜歡的是2.5層架構:瀏覽器+ CouchDB +外部或_改變基於feed的「操作」。在這種情況下,PHP(或類似的)充當了一個對CouchDB進行排序的服務提供者。可以通過讓PHP觀看某些類型的文檔及其更改(即圖像上載,電子郵件消息文檔)的_changes feed或CouchDB可以設置爲「ping」外部處理程序以對文檔進行進一步處理來觸發操作或其附件。這基本上就是couchdb-lucene的工作原理,通過觀察更新並在發生時或定期對它們採取行動。

你可以找到更多關於_changes飼料及以下_external處理程序:

爲了什麼它的價值,我本週三將在PHP and CouchDB Webcast討論這三個選項。在網絡直播結束時,您的問題將成爲討論的寶貴補充。

我很想知道您的CouchApp如何實現,以及您如何解決上述問題。

+0

非常好我一定會收到週三...我目前處於一個非常早期的階段,但只是想知道如何在沒有服務器端選項的情況下獲得社交oAuth ......我可能傾向於選項2儘管選項3當然有好處。 – dworrad 2010-11-14 22:38:15

1

從BigBlueHat優秀的答案,但我還有一個更可能的選項中增加:

克服了跨域問題,從而讓您可以從任何類型的web服務器的服務頁面,並允許瀏覽器直接與CouchDB(可以在另一臺服務器上)進行交互。

由瀏覽器強制實施的跨域限制並非難以避免。 我知道的兩個主要方法是:JSONP和CORS。

JSONP將每個請求僞裝成「腳本」請求(因爲腳本請求不受跨域規則限制)。它只適用於GET,而不是POST或PUT或其他任何東西。你可以用jQuery來做到這一點。

CORS是「跨源資源共享」,它只是一個特殊的HTTP頭,必須在服務器上實現(本例中爲couchdb),它告訴瀏覽器它沒問題 - 它並不介意服務來自其他域的請求。我已經測試過了,它確實有效,但可能存在安全問題 - 我不確定。

所以......我不知道這是否是一個好主意,但從技術上來說(至少部分)可以用CouchDB來克服跨域限制。有沒有人建立過使用這種設置的系統?