2

我正在使用 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
4

1 回答 1

4

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

于 2013-07-31T21:06:12.807 回答