You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by Apache Wiki <wi...@apache.org> on 2010/04/08 20:03:03 UTC
[Couchdb Wiki] Update of "How_to_intercept_document_updates_and_perform_additional_server-side_processing" by SebastianCohnen
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Couchdb Wiki" for change notification.
The "How_to_intercept_document_updates_and_perform_additional_server-side_processing" page has been changed by SebastianCohnen.
The comment on this change is: added toc; syntax hl; cleanup.
http://wiki.apache.org/couchdb/How_to_intercept_document_updates_and_perform_additional_server-side_processing?action=diff&rev1=4&rev2=5
--------------------------------------------------
+ = Document Update Handlers =
+ <<TableOfContents()>>
+
== Basics ==
CouchDB (0.10 and up) has the ability to allow server-side processing of an incoming document before it's committed. This feature allows a range of use cases such as providing a server-side last modified timestamp, etc.
@@ -8, +11 @@
This functionality is implemented via document update handlers defined in a design doc. Specifically, in a design doc one defines an "updates" attribute that contains any number of document update handlers. The follow handlers should be self-explanatory as to what they accomplish.
- {{{
+ {{{#!highlight javascript
+ {
- updates: {
+ updates: {
- "hello" : function(doc, req) {
+ "hello" : function(doc, req) {
- if (!doc) {
+ if (!doc) {
- if (req.docId) {
+ if (req.docId) {
- return [{
+ return [{
- _id : req.docId
+ _id : req.docId
- }, "New World"]
+ }, "New World"]
- }
- return [null, "Empty World"];
}
+ return [null, "Empty World"];
+ }
- doc.world = "hello";
+ doc.world = "hello";
- doc.edited_by = req.userCtx;
+ doc.edited_by = req.userCtx;
- return [doc, "hello doc"];
+ return [doc, "hello doc"];
- },
+ },
- "in-place" : function(doc, req) {
+ "in-place" : function(doc, req) {
- var field = req.query.field;
+ var field = req.query.field;
- var value = req.query.value;
+ var value = req.query.value;
- var message = "set "+field+" to "+value;
+ var message = "set "+field+" to "+value;
- doc[field] = value;
+ doc[field] = value;
- return [doc, message];
+ return [doc, message];
- },
+ },
- "bump-counter" : function(doc, req) {
+ "bump-counter" : function(doc, req) {
- if (!doc.counter) doc.counter = 0;
+ if (!doc.counter) doc.counter = 0;
- doc.counter += 1;
+ doc.counter += 1;
- var message = "<h1>bumped it!</h1>";
+ var message = "<h1>bumped it!</h1>";
- return [doc, message];
+ return [doc, message];
- },
+ },
- "error" : function(doc, req) {
+ "error" : function(doc, req) {
- superFail.badCrash;
+ superFail.badCrash;
- },
+ },
- "xml" : function(doc, req) {
+ "xml" : function(doc, req) {
- var xml = new XML('<xml></xml>');
+ var xml = new XML('<xml></xml>');
- xml.title = doc.title;
+ xml.title = doc.title;
- var posted_xml = new XML(req.body);
+ var posted_xml = new XML(req.body);
- doc.via_xml = posted_xml.foo.toString();
+ doc.via_xml = posted_xml.foo.toString();
- var resp = {
+ var resp = {
- "headers" : {
+ "headers" : {
- "Content-Type" : "application/xml"
+ "Content-Type" : "application/xml"
- },
+ },
- "body" : xml
+ "body" : xml
- };
+ };
-
+
- return [doc, resp];
+ return [doc, resp];
- }
- }
+ }
+ }
+ }
}}}
The handler function takes the document and the http request as parameters. It returns a two-element array: the first element is the (updated) document, which is committed to the database. The second element is the response that will be sent back to the caller.