incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From James Dingwall <james.dingw...@zynstra.com>
Subject Re: Update functions and require()
Date Thu, 12 Dec 2013 14:23:51 GMT
James Dingwall wrote:
> Hi,
>
> I am experiencing some problems with update functions which I use to 
> create documents in CouchDB when they are using require() to load a 
> common library.  It seems that after publishing the design document 
> then the first update function to be called works well but any 
> subsequent ones do not call require().  With the log() call in the 
> require I see this appear in the call to the first update but it does 
> not appear with any others, they print a stack trace such as:
> [Thu, 12 Dec 2013 13:20:55 GMT] [error] [<0.6458.0>] httpd 500 error 
> response:
>  {"error":"render_error","reason":"function raised error: (new 
> ReferenceError(\"docUtil is not defined\", \"updates.template\", 54))
> stacktrace: (null,[object Object])@updates.template:54
> runUpdate(<<<body of update function>>>),[object Object],[object 
> Array])@/usr/local/share/couchdb/server/main.js:1033
> (\"_design/provision\",[object Array],[object 
> Array])@/usr/local/share/couchdb/server/main.js:1517
> ()@/usr/local/share/couchdb/server/main.js:1562
> @/usr/local/share/couchdb/server/main.js:1573
> "}
>
> As far as I can tell by require()d code is ok since the same structure 
> is working for other things.  What it seems to me is that it is loaded 
> by CouchDB for the first update function and is then recorded as 
> loaded but a second update function needing the same code has its 
> require ignored but cannot reference the in memory copy produce by the 
> require from the first update.
>
> I have tested versions CouchDB 1.3.1, 1.4.0 and 1.5.0 all with the 
> same behaviour.  I am running on Ubuntu precise with esl-erlang 
> 1:16.b.3-1.
>
> Any suggestions on where to look next?
>
> Thanks,
> James
>
>
> As an example:
>
> The updates are all of the form:
> function(doc, req) {
>   require('views/lib/docUtil');
>
>   if(!doc) {
>      doc = {some: defaults}
>   }
>
>   // some other code
>
>   doc.meta = docUtil.metaCreate(req);
>
>   return([doc, JSON.stringify(doc, undefined, 2)]);
> }
>
> views/lin/docUtil is similar too:
> (function(global) {
>
> var _metaCreate = function(req) {
> ...
> };
>
> var _metaModify = function(req) {
> ...
> };
>
> log('docUtil loaded')
> global.docUtil = {
>   metaCreate = _metaCreate,
>   metaModify = metaModify
> };
>
> })(exports.docUtil = this)
>

Here is a complete test case design document which demonstrates the problem.

{
    "_id": "_design/ptest",
    "updates": {
        "two": "function(doc, req) 
{\n\trequire('views/lib/docUtil');\n\n\tif(!doc) {\n\t\tdoc = 
{};\n\t}\n\n\tdoc._id = 'two';\n\n\tdoc.meta = 
docUtil.metaCreate();\n\n\treturn([doc, JSON.stringify(doc, undefined, 
2)]);\n}",
        "one": "function(doc, req) 
{\n\trequire('views/lib/docUtil');\n\n\tif(!doc) {\n\t\tdoc = 
{};\n\t}\n\n\tdoc._id = 'one';\n\n\tdoc.meta = 
docUtil.metaCreate();\n\n\treturn([doc, JSON.stringify(doc, undefined, 
2)]);\n}"
    },
    "language": "javascript",
    "views": {
        "lib": {
            "docUtil": "(function(global) {\n\nvar _metaCreate = 
function() {\n\treturn({\n\t\ta: 'create',\n\t\tb: 
'bbbb'\n\t});\n};\n\nvar _metaModify = function() {\n\treturn({\n\t\ta: 
'modify',\n\t\tb: 'bbbb'\n\t});\n};\n\nglobal.docUtil = {\n\tmetaCreate: 
_metaCreate,\n\tmetaModify: _metaModify\n};\n\nlog('require 
docUtil');\n\n})(exports.docUtil = this)"
        }
    },
    "type": "design/ptest"
}

Call the update functions like:
curl -X POST http://couchdb:5984/zydev/_design/ptest/_update/one - 
creates a document
curl -X POST http://couchdb:5984/zydev/_design/ptest/_update/two - fails






Mime
View raw message