[
https://issues.apache.org/jira/browse/COUCHDB-354?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12712141#action_12712141
]
Brian Candler commented on COUCHDB-354:
---------------------------------------
It's the only version provided in both Ubuntu Hardy and Ubuntu Jaunty. It also
works perfectly fine for me in general, and I don't think the problem is
anything to do with the Javascript engine.
Hidden in the barf you can see what the error is - it's caused by the toJSON
function in main.js, which in skeleton form looks like this: it's a strange
sort of case statement.
return {'Array':f1, 'Boolean':f2, ...}[val.constructor.name](val);
The problem is that if val is a function, val.constructor.name is 'Function'
which is not defined in the object, so you are essentially calling
undefined(val).
You can get a rather better error by catching unexpected values, e.g. like this:
--- main.js.orig 2009-05-22 16:26:22.000000000 +0100
+++ main.js 2009-05-22 16:32:05.000000000 +0100
@@ -306,7 +306,7 @@
if (typeof(val) == "xml") { // E4X support
val = val.toXMLString();
}
- return {
+ var handlers = {
"Array": function(v) {
var buf = [];
for (var i = 0; i < v.length; i++) {
@@ -351,7 +351,11 @@
}
return '"' + v + '"';
}
- }[val != null ? val.constructor.name : "Object"](val);
+ }
+ var k = val != null ? val.constructor.name : "Object";
+ var h = handlers[k];
+ if (!h) { throw ("Cannot encode '" + k + "' value as JSON") };
+ return h(val);
}
function compileFunction(source) {
But I still get a 'badmatch' crash:
** Reason for termination ==
** {{badmatch,<<"Cannot encode 'Function' value as JSON">>},
[{couch_query_servers,'-rereduce/3-fun-0-',3},
{lists,zipwith,3},
{couch_query_servers,rereduce,3},
{couch_view_group,'-init_group/4-fun-0-',4},
{couch_btree,'-write_node/3-lc$^0/1-0-',3},
{couch_btree,write_node,3},
{couch_btree,complete_root,2},
{couch_btree,query_modify,4}]}
Given that you've closed this ticket a second time, I'll defer to your
judgement that you do not think this should be fixed, and leave it closed.
> Ungraceful behaviour if view returns a function
> -----------------------------------------------
>
> Key: COUCHDB-354
> URL: https://issues.apache.org/jira/browse/COUCHDB-354
> Project: CouchDB
> Issue Type: Improvement
> Components: JavaScript View Server
> Environment: {"couchdb":"Welcome","version":"0.10.0a776990"}
> Reporter: Brian Candler
> Priority: Minor
> Attachments: barf.log, test_reduce_barf.rb
>
>
> If a typo in a view definition causes it to return a function instead of a
> normal value:
> * the view server crashes
> * you get a huge Erlang barf in the log with worrying messages like "OS
> process timed out" and "brutal kill"
> I got all this just by accidentally writing "vs.shift" instead of "vs.shift()"
> The fundamental problem is that a function cannot be serialised in toJSON,
> but the error message is not helpful:
> OS Process Log Message: Error converting object to JSON: TypeError:
> {Array:function (v) {var ... snip loads ... "Object"] is not a function
> When actually the problem is that the object I was trying to convert *was* a
> function :-)
> I will attach some code which replicates this, and the barf generated.
> Of course this is entirely down to user error in an invalid map/reduce
> function. However there's already a clean error for 'undefined', maybe this
> could be done for 'function' too (or indeed any non-serialisable entity)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.