CouchDB更新处理程序:文档ID不能为空

时间:2016-01-11 15:26:31

标签: javascript couchdb seamonkey nosql

我编写了简单的更新处理程序:

 {
   "handler": "function (doc, req) { if (req.userCtx.roles.indexOf('editor') < 0) return [req.userCtx, 'access error']; if (!doc) { return [doc, 'nothing']; } doc.date = new Date(); doc.edited_by = req.userCtx.name; return [doc, toJSON(doc)]; }"
}

当我尝试从Mozilla HttpRequester http://192.168.0.34:5984/records/_design/records/_update/handler进行查询时,我正在

使用该数据

{"title":"testtest","content":"test"}

获得

{"error":"bad_request","reason":"Document id must not be empty"}

我已将_id添加到JSON

{"_id":"testid","title":"testtest","content":"test"}

没有运气。

更新:在浏览器中运行该查询会返回nothing,这可能表示没有发送任何文档,但这不是真的。我做错了什么?

1 个答案:

答案 0 :(得分:0)

在CouchDB中,更新处理程序_id从未自动设置,因此您必须手动执行此操作。最简单的解决方案是使用uuidsreq.uuid

更新处理程序的一个重要事项。他们的语法有点奇怪:你不能拿数据并返回doc,没有。您的更新处理程序采用docreq个对象,其中第一个是更改文档(使用!doc检查文档是否存在,如果它返回true - 您可以创建新文件)和第二个是请求数据,包括访问信息,uuid和正文。我们从服务器获取的数据不是req,而是req.body,这是原始字符串。必须首先使用JSON.parse(req.body)解析。做了一些检查后,我们可以返回 - 但返回也不容易。如果我们有一个文档 - 我们正在改变它,如果没有 - 我们正在创建新对象。返回必须由数组[data_to_be_written, return_data]完成,其中第一项是数据库的文档,第二项是字符串(只有字符串,使用toJSON(object)返回对象)。

此外还有我的更新处理函数示例,有很多脏调试代码,它可能是错误的,但它正在创建(更新仍未选中)。

function (doc, req) {
    if (req['userCtx']['roles'].indexOf('editor') < 0) {
        return [null, 'Access denied'];
    }
    var rcv = JSON.parse(req.body);
    if (!doc) {
        if (!rcv['_id'] && !!rcv['title'] && !!rcv['content']) {
            return [{ '_id':req.uuid,'title': rcv['title'], 'content': rcv['content'], 'date': new Date(), 'edited_by': req['userCtx']['name'] }, 'Created' + toJSON(req)];
        }
        return [null, 'Empty' + toJSON({ 'no_id': !rcv['_id'], 'title': !!rcv['title'], 'content': !!rcv['content'], 'body':req.body })];
    }
    doc['date'] = new Date();
    doc['edited_by'] = req['userCtx']['name'];
    return [doc, 'Edited' + toJSON(doc)];
}

P.S&GT;并且记住,即使更新处理程序在验证函数上工作,因此如果您的数据无法通过验证,则无论如何都不会写入。