尝试使用过滤器进行复制,我偶然发现了一个问题。 虽然我的过滤器在_replicator数据库中作为一个条目工作,但在使用cURL时我没有。
设计文档中的过滤器是:
{
"_id": "_design/partial",
"filters": {
"mobile": "function(doc, req) {
if (doc._attachments) {
var result = new Boolean(true);
for (attachment in doc._attachments) {
if (attachment.content_type == 'image/jpeg') {
return true;
}
if (doc._attachments.length > 1024) {
result = false;
}
}
return result;
} else {
return true;
}
}"
}
}
cURL专栏:
curl -X POST http://admin:pass@192.168.178.13:5985/_replicate -d '{\"source\":\"http://admin:pass@192.168.2:5984/docs2\",\"target\":\"docs2_partial\",\"filter\":\"partial/mobile\",\"create_target\":true}' -H "Content-Type: application/json"
我在目标和源上创建了_design / partial文档,但所有文档都在被复制。即使附加二进制大于1 MB的那个。 任何帮助表示赞赏!
cURL回复是:
{"ok":true,"session_id":"833ff96d21278a24532d116f57c45f31","source_last_seq":32,"replication_id_version":2,"history":[{"session_id":"833ff96d21278a24532d116f57c45f31","start_time":"Wed, 17 Aug 2011 21:43:46 GMT","end_time":"Wed, 17 Aug 2011 21:44:22 GMT","start_last_seq":0,"end_last_seq":32,"recorded_seq":32,"missing_checked":0,"missing_found":28,"docs_read":28,"docs_written":28,"doc_write_failures":0}]}
使用“代替\”或“代替”结果是:
{"error":"bad_request","reason":"invalid UTF-8 JSON: [...]}
答案 0 :(得分:8)
现在我想也许你的过滤器功能的逻辑只是有一个bug。以下是我阅读过滤政策的方法:
image/jpeg
附件的文档这听起来似乎是一个不正确的政策。重申此政策的另一种方法是“超过1024个附件的文档失败,其他所有内容都会通过。”但是,由于您编写了如此多的代码,我怀疑我的摘要不是真正的政策。
另一个快速说明,看起来像一个bug。给出:
for (attachment in doc._attachments) { /* ... */ }
attachment
变量将是“index.html”或“me.jpeg”,即文件名。要获取附件内容类型,您需要:
var type;
// This is WRONG
type = attachment.content_type; // type set to undefined
// This is RIGHT
type = doc._attachments[attachment].content_type; // type set to "text/html" etc.
为避免此错误,您可以更改代码以使事情更加清晰:
for (attachment_filename in doc._attachments) { /* ... */ }
接下来,doc._attachments.length
会告诉您文档中的附件数量,而不是当前附件的长度。你在循环中测试它是很奇怪的,因为表达式永远不会改变。您是否尝试测试附件尺寸?
答案 1 :(得分:0)
curl的输出是什么(即来自CouchDB)?
从您的示例中,我的第一个猜测是您有引用错误。在单引号内,您不需要转义双引号。尝试删除所有这些反斜杠。会发生什么?
如果您使用的是Windows,则单引号在shell中无效。在这种情况下,请保留反斜杠,然后将单引号更改为双引号。