CouchDB 更新处理程序:文档 ID 不能为空
CouchDB update handlers: document id must not be empty
我编写了简单的更新处理程序:
{
"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"}
运气不好。
更新:和运行在浏览器中查询returns nothing
,这可能表明没有文件发送,但事实并非如此。我做错了什么?
在 CouchDB 更新处理程序中 _id
从未自动设置,因此您必须手动设置。最简单的解决方案是使用 uuids
,可在 req.uuid
.
获得
关于更新处理程序的一件重要事情。他们的语法有点奇怪:你不能获取数据和 return 文档,不。您的更新处理程序采用 doc
和 req
对象,其中第一个是更改文档(使用 [=16= 检查文档是否存在],如果它 returns true
— 您可以create new),二是请求数据,包括access info、uuid和body。我们从服务器获取的数据不在 req
中,而是在 req.body
中,这是原始字符串。必须首先使用 JSON.parse(req.body)
解析。做了一些检查后,我们可以 return — 但 return 也不容易。如果我们有文档——我们正在更改它,如果没有——我们正在创建新对象。 Return 必须由数组 [data_to_be_written, return_data]
完成,其中第一项是数据库的文档,第二项是字符串(并且只有字符串,使用 toJSON(object)
到 return 对象)。
此外还有我的更新处理程序函数示例,其中有很多脏调试代码,可能是错误的,但它正在创建(更新仍未选中)。
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> 请记住,即使更新处理程序也在验证函数上工作,所以如果您的数据无法通过验证,则无论如何都不会写入。
我编写了简单的更新处理程序:
{
"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"}
运气不好。
更新:和运行在浏览器中查询returns nothing
,这可能表明没有文件发送,但事实并非如此。我做错了什么?
在 CouchDB 更新处理程序中 _id
从未自动设置,因此您必须手动设置。最简单的解决方案是使用 uuids
,可在 req.uuid
.
关于更新处理程序的一件重要事情。他们的语法有点奇怪:你不能获取数据和 return 文档,不。您的更新处理程序采用 doc
和 req
对象,其中第一个是更改文档(使用 [=16= 检查文档是否存在],如果它 returns true
— 您可以create new),二是请求数据,包括access info、uuid和body。我们从服务器获取的数据不在 req
中,而是在 req.body
中,这是原始字符串。必须首先使用 JSON.parse(req.body)
解析。做了一些检查后,我们可以 return — 但 return 也不容易。如果我们有文档——我们正在更改它,如果没有——我们正在创建新对象。 Return 必须由数组 [data_to_be_written, return_data]
完成,其中第一项是数据库的文档,第二项是字符串(并且只有字符串,使用 toJSON(object)
到 return 对象)。
此外还有我的更新处理程序函数示例,其中有很多脏调试代码,可能是错误的,但它正在创建(更新仍未选中)。
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> 请记住,即使更新处理程序也在验证函数上工作,所以如果您的数据无法通过验证,则无论如何都不会写入。