javascript - que - Controladores de actualización de CouchDB: la identificación del documento no debe estar vacía
mongodb español (1)
Escribí un controlador de actualización simple:
{
"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)]; }"
}
Cuando intento consultar desde Mozilla HttpRequester http://192.168.0.34:5984/records/_design/records/_update/handler
, me estoy poniendo
con eso son los datos
{"title":"testtest","content":"test"}
Y consiguiendo
{"error":"bad_request","reason":"Document id must not be empty"}
He agregado _id
a JSON
{"_id":"testid","title":"testtest","content":"test"}
Sin suerte.
Actualización: y ejecutar esa consulta en el navegador nothing
devuelve nothing
, lo que puede indicar que no se envió ningún documento, pero eso no es cierto. ¿Qué estoy haciendo mal?
En el controlador de actualización CouchDB _id
nunca se ha configurado automáticamente, por lo que debe hacerlo manualmente. La solución más simple es usar uuids
, que está disponible en req.uuid
.
Una cosa importante sobre los manejadores de actualizaciones. Su sintaxis en algún lugar extraño: no se puede tomar datos y devolver el documento, no. Su controlador de actualización toma objetos doc
y req
, donde primero está un documento cambiante (compruebe la existencia del documento usando !doc
, si devuelve true
; puede crear uno nuevo) y el segundo es datos de solicitud, incluida información de acceso, uuid y cuerpo. Estamos obteniendo datos del servidor no en req
, pero en req.body
, que es cadena sin procesar. Se debe analizar primero usando JSON.parse(req.body)
. Después de hacer algunas comprobaciones, podemos regresar, pero el regreso tampoco es fácil. Si tenemos un documento, lo estamos cambiando, si no, estamos creando un nuevo objeto. El retorno debe hacerse mediante una matriz [data_to_be_written, return_data]
, donde el primer elemento es un documento para la base de datos y el segundo es una cadena (y solo cadena, use toJSON(object)
para devolver objetos).
Además, está mi ejemplo de función de controlador de actualización, hay un montón de código de depuración sucio y puede estar mal, pero está trabajando en la creación (actualización aún no seleccionada).
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)];
}
PD> y recuerde, incluso el controlador de actualización funciona sobre el func de validación, de modo que si sus datos no pueden pasar la validación, no se escribirá de todos modos.