Browse files

Changed handler format to conform to Node.js norms.

Callbacks should always take an "err" argument first for asynchronous
error handling.

Callbacks should be passed in as the last parameter (this was already
the case).

The parameter array should be passed in as an array. -- Now, I had
quite some internal debate about this. It is nicer syntax-wise to have
the arguments come in as actual arguments, not as an array.

However, it does have the effect that the callback parameter moves
around depending on user-submitted data. So the function will have to
handle finding out which parameter is the callback, which is a lot
uglier and more error-prone than just passing in the arguments as an

Finally, I've added an additional parameter "opt" which contains the
HTTP request object and the server object. This is useful as an
extensible way to deliver more features and options to the handler in
future versions of the library.

Here is an example handler with the new syntax:

server.expose('multiply', function (args, opt, callback) {
  var a = args[0],
      b = args[1];

  callback(null, a*b);
  • Loading branch information...
1 parent baf3779 commit 4d7cfe6701af6f074e14184e4d31cf5dc4e08e62 @justmoon justmoon committed Jul 4, 2011
Showing with 16 additions and 6 deletions.
  1. +16 −6 src/jsonrpc.js
@@ -193,14 +193,24 @@ Server.prototype.handlePOST = function(req, res) {
// Try to call the method, but intercept errors and call our
// onFailure handler.
var method = self.functions[decoded.method];
- var args = decoded.params.push(function(resp) {
- onSuccess(resp);
- });
+ var callback = function(err, result) {
+ if (err) {
+ onFailure(err);
+ } else {
+ onSuccess(result);
+ }
+ };
+ // Other various information we want to pass in for the handler to be
+ // able to access.
+ var opt = {
+ req: req,
+ server: self
+ };
try {
- method.apply(null, decoded.params);
- }
- catch(err) {
+, decoded.params, opt, callback);
+ } catch (err) {
return onFailure(err);

0 comments on commit 4d7cfe6

Please sign in to comment.