【问题标题】:Cloudant "case_clause" error with pouchdb when replicating复制时 pouchdb 出现 Cloudant“case_clause”错误
【发布时间】:2013-08-01 12:40:22
【问题描述】:

我正在使用 Pouchdb 和 Cloudant,当我的 Web 应用程序启动时,它会在浏览器中从 Cloudant 复制到我的 pouchdb。我对 pouchdb 内部的工作方式有所了解,这就是我认为该过程的工作方式(高级):

  1. 复制开始
  2. 从 cloudant db 获取检查点文档(包含从服务器检索的最新序列号,如果不存在,假设序列号为 0,这是我的情况)
  3. 从从该序列号开始释放的更改中获取更改(最多获取 25 个更改)
  4. 使用新的序列号将检查点文档写入(或更新)回 Cloudant 服务器(这样,如果发生网络错误,它可以从中断处继续或进行下一次复制)
  5. 重复直到没有更改为止
  6. 复制完成

问题出在第 4 步,当 pouch 尝试将该文档写入 cloudant 服务器时(第一次),服务器返回“case_clause”错误。我认为问题可能是发送给 cloudant 的 id 无效(cloudant 不接受这种格式的 id),因为写入服务器的文档的 id 是 _local/799c37dfaefb3774a04f55c7f8cee947 (或最后的其他随机数和字符) .我不知道这是否是有效的文档 ID(对于 cloudant 来说,因为这对于 pouchdb 来说是准确的),所以我想我问的是问题(cloudant 的 id 不可接受),还是有一些基于 cloudant 服务器返回的错误的其他问题。

这是正在编写的文档:

{ _id: "_local/799c37dfaefb3774a04f55c7f8cee947", last_seq:“63” }

这是 Chrome 调试器的完整错误输出:

{ 错误:“case_clause” 原因:“{{case_clause,{ok,{error,[{{doc,>, {338, [>]}, {[{>,>}]}, [],错误的,[]}, {error,internal_server_error}}]}}}, [{fabric,update_doc,3},{chttpd_db,'-update_doc/6-fun-0-',3}]}" 堆栈:数组[4] 0:“chttpd_db:update_doc/6” 1:“chttpd:handle_request/1” 2:“mochiweb_http:headers/5” 3:“proc_lib:init_p_do_apply/3” 长度:4 __proto__: 数组[0] 状态:500 }

注意:当我进入 cloudant 的被褥并使用其 id 手动输入检查点文档的 url 时,它不存在。

谢谢

编辑:

使用 Chrome 调试器获取上述请求的标头信息:

请求网址:http://lessontrek.toddbluhm.c9.io/db/ilintindingreseseldropec/_local%2F799c37dfaefb3774a04f55c7f8cee947 请求方法:PUT 状态码:500 内部服务器错误 请求标头视图已解析 PUT /db/ilintindingreseseldropec/_local%2F799c37dfaefb3774a04f55c7f8cee947 HTTP/1.1 主持人:lessontrek.toddbluhm.c9.io 连接:保持活动 内容长度:111 接受:应用程序/json 来源:http://lessontrek.toddbluhm.c9.io 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36 内容类型:应用程序/json 推荐人:http://lessontrek.toddbluhm.c9.io/app 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8 Cookie:connect.sid=s%3A8MVBFmbizTX4VNOqZNtIuxQI.TZ9yKRqNv0ePbTB%2FmSpJsncYszJ8qBSD5EWHzxQYIbg; AuthSession=(出于安全目的已删除,但有效); db_name=ilintindingreseldropec; __utma=200306492.386329876.1368934655.1375164160.1375252679.55; __utmc=200306492; __utmz=200306492.1372711539.22.2.utmcsr=google|utmccn=(有机)|utmcmd=有机|utmctr=(未提供%20); c9.live.proxy=(出于安全目的已删除,但有效) 请求 Payloadview 解析 {"_id":"_local/799c37dfaefb3774a04f55c7f8cee947","last_seq":"63","_rev":"338-7db9750558e43e2076a3aa720a6de47b"} 响应标头视图已解析 HTTP/1.1 500 内部服务器错误 x-powered-by: Express 变化:接受编码 x-couch-request-id: 7d2ca9fc 服务器:CouchDB/1.0.2 (Erlang OTP/R14B) 日期:2013 年 7 月 31 日星期三 07:29:23 GMT 内容类型:应用程序/json 缓存控制:必须重新验证 内容编码:gzip 传输编码:分块 通过:1.1 项目-livec993c2dc8b8c.rhcloud.com (node-web-proxy/0.4) X-C9-Server:proxy_subdomain_collab-bus2_01

【问题讨论】:

    标签: couchdb cloudant bigcouch pouchdb


    【解决方案1】:

    Cloudant 与 CouchDB 一样,期望所有 _local revs 都以“0-”开头。 pouchdb 不应该生成这种形式的 rev 值。如果您尝试对 CouchDB 执行此 PUT,您将获得相同的堆栈跟踪。

    【讨论】:

    • 太好了,谢谢。我认为,_rev 的存在表明我们的 _local 文档处理中存在错误。我们会解决的。
    • 啊,我完全错过了!感谢您指出了这一点。如果是新文档,则不应包含 _rev!我相信它也是 pouchdb 中的一个错误。
    • 而且,供您参考,Cloudant,无论如何都不关心 _rev 值(对于本地文档)。提供非 0 的 _rev 似乎会引起错误。目前,在 cloudant 上更新本地文档时,您只需删除 _rev。
    猜你喜欢
    • 2014-10-27
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多