[ https://issues.apache.org/jira/browse/COUCHDB-336?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12706759#action_12706759 ]
Brian Candler commented on COUCHDB-336: --------------------------------------- Sorry, my mistake for using eval instead of evalcx. The problem seems to be that evalcx silently catches and discards all errors: js> evalcx('junk('); js> evalcx('throw("wobbly")'); js> result = evalcx('throw("wobbly")'); js> typeof result undefined js> I'll ask about this on dev-tech-javascript. At the moment, the only solution I can see is to eval() inside the evalcx(), which is ugly as it involves re-escaping the source string. > Would like errors in map function to be reported to client > ---------------------------------------------------------- > > Key: COUCHDB-336 > URL: https://issues.apache.org/jira/browse/COUCHDB-336 > Project: CouchDB > Issue Type: Wish > Environment: svn trunk 0.10.0a768591 > Reporter: Brian Candler > Priority: Minor > > At the moment, if a runtime error occurs in a map function, the document is > silently excluded from the view and the client is none the wiser. > $ curl -X PUT http://127.0.0.1:5984/test > {"ok":true} > $ curl -d '{"foo":"bar"}' -X PUT http://127.0.0.1:5984/test/doc1 > {"ok":true,"id":"doc1","rev":"1-3413565576"} > $ curl -d '{"food":"bar"}' -X PUT http://127.0.0.1:5984/test/doc2 > {"ok":true,"id":"doc2","rev":"1-2088327893"} > # Example 1: map function calls undefined function > $ curl -d '{"map":"function(doc) { emitt(null,null); }"}' -H 'Content-Type: > application/json' -X POST http://127.0.0.1:5984/test/_temp_view > {"total_rows":0,"rows":[]} > # Example 2: map function attempts to emit 'undefined' > $ curl -d '{"map":"function(doc) { emit(doc._id,doc.foo); }"}' -H > 'Content-Type: application/json' -X POST http://127.0.0.1:5984/test/_temp_view > {"total_rows":1,"offset":0,"rows":[ > {"id":"doc1","key":"doc1","value":"bar"} > ]} > Of course, errors are available in the server log: > [Tue, 28 Apr 2009 08:40:39 GMT] [info] [<0.1276.0>] OS Process Log Message: > function raised exception (ReferenceError: emitt is not defined) with doc._id > doc1 > [Tue, 28 Apr 2009 08:43:44 GMT] [info] [<0.1276.0>] OS Process Log Message: > function raised exception (Cannot encode 'undefined' value as JSON) with > doc._id doc2 > But the client cannot see these, and worse, gets what appears to be a valid > result set. > I think there are two cases to consider. > - in temporary views, it ought to be easy to do something: e.g. (1) return > the full set of failed docs with their errors, or (2) return a count of > failed docs, or (3) just abort on the first error > - in permanent views, it might also be useful to return this information, but > it could be expensive to persist. Also, when you're querying for key X you > might not want to see a whole load of errors for unrelated docs. An error > count might be OK though, similar to total_rows. > The current behaviour may be useful, although I personally wouldn't want to > rely on it, especially as it generates errors in the log. That is, I would > rather be forced to rewrite example 2 as > function(doc) { if (doc.foo) { emit(doc._id, doc.foo); } } > or > function(doc) { emit(doc._id, doc.foo || null); } > as appropriate. > Workaround: users can manually wrap each of their map functions in a catcher > which emits a sentinel key/value pair containing the error. However they > would still have to query the key range which includes the error messages. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.