: ошибка clouchdb с идентификатором - PullRequest
2 голосов
/ 24 сентября 2011

Я получаю сообщение об ошибке в одной части :clouchdb примера кода (это ссылка, но включенный файл examples.lisp также не работает должным образом).

В частности, когда я ввожу

> (create-document '((:|name| . "wine") (:|tags| . ("beverage" "fun" "alcoholic"))))

Я получаю DOC-ERROR состояние

Reason "Content-Type must be application/json", Document ID: "NIL"
   [Condition of type DOC-ERROR]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" RUNNING {10040D2E11}>)

Backtrace:
  0: (POST-DOCUMENT ((:|name| . "wine") (:|tags| "beverage" "fun" "alcoholic")))
  1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CREATE-DOCUMENT '((:|name| . "wine") (:|tags| "beverage" "fun" "alcoholic"))) #<NULL-LEXENV>)
 --more--

Предполагаемый эффект этого примера состоит в том, что CouchDB назначает идентификатор новому документу (это ясно видно как на связанной странице, так и в комментариях к файлу кода).

Я использую SBCL 1.0.40.0, clouchdb_0.0.11 (прямо из quicklisp) и CouchDB 0.11 из репозиториев Debian, если это имеет значение. Я также использую 64-битную версию Debian.

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

CouchDB требует "Content-Type: application / json", когда POST'ing документы, это довольно новое требование, поэтому я думаю, что clouchdb просто еще этого не делает.

Короче версия: Похоже,clouchdb не совместим с последними выпусками CouchDB.

3 голосов
/ 24 сентября 2011

Только что проверил источник. Роберт Ньюсон выше верен; clouchdb по-прежнему устанавливает content-type в "text / javascript", в то время как post загружает и put читает документы (последний, похоже, работает в любом случае, только сообщения об ошибках).

Если вы не хотите использовать chillax, как я предлагал выше, вы можете зайти в файл clouchdb.lisp и изменить определение post-document так, чтобы оно установило :content-type на «application / json».

После этого вы сможете create-document без набора :id, и CouchDB ответит, сгенерировав новый для вас.

Патч, основанный на quicklisp коде для clouchdb (не то чтобы это было достаточно сложно, чтобы нуждаться в нем):

--- clouchdb.lispOLD    2011-09-24 09:38:20.000000000 -0400
+++ clouchdb.lisp    2011-09-24 09:38:58.000000000 -0400
@@ -753,7 +753,7 @@
 the :ID property."
   (let ((res (ensure-db ()
                (db-request (cat (url-encode (db-name *couchdb*)) "/")
-                           :content-type "text/javascript"
+                           :content-type "application/json"
                            :external-format-out +utf-8+
                            :content-length nil
                            :method :post
...