开发者

:clouchdb error with ID

I'm getting an error on one part of the :clouchdb example code (that's a link, but the examples.lisp file included doesn't work properly either).

Specifically, when I input

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

I get a DOC-ERROR condition

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

The intended effect of the example is to have CouchDB assign an ID to the new document (this is made clear both in the linked page and in the comments of the code file).

I'm running SBCL 1.0.40.0, clouchdb_0.0.11 (straight out of quicklisp) and CouchDB 0.11 from the Debian repos, in case it开发者_如何学C matters. I'm also on a 64-bit Debian box.

Can anyone point me in the right direction?


CouchDB requires a "Content-Type: application/json" when POST'ing documents, this is a fairly new requirement so I think clouchdb simply isn't doing it yet.

Shorter version: Sounds like clouchdb is not compatible with recent releases of CouchDB.


Just checked the source. Robert Newson above is correct; clouchdb is still setting the content-type to "text/javascript" while posting and putting documents (the latter seems to work anyway, only the post errors).

If you don't feel like using chillax as I suggest above, you can go into the clouchdb.lisp file and change the definition of post-document such that it sets :content-type to "application/json".

You should then be able to create-document without an :id set, and CouchDB will respond by generating a new one for you.

Patch based on the quicklisp code for clouchdb (not that this is complicated enough to need one):

--- 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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜