mysqlnode.jsasynchronoussocketstream

socketstream async call to mysql within rpc actions


First, I need to tell you that I am very new to the wonders of nodejs, socketstream, angularjs and JavaScript in general. I come from a Java background and this might explain my ignorance of the correct way of doing things async.

To toy around with things I installed the ss-angular-demo from americanyak. My problem is now that the Rpc seems to be a synchronous interface and my call the the mysql database has an asynchronous interface. How can I return the database results upon a call of the Rpc?

Here is what I did so far with socketstream 0.3:

In app.js I successfully tell ss to allow my mysql database connection to be accessed by putting ss.api.add('coolStore',mysqlConn); in there at the right place (as explained in the socketstream docs). I use the mysql npm, so I can call mysql within the Rpc

server/rpc/coolRpc.js

exports.actions = function (req, res, ss) {

  // use session middleware
  req.use('session');

  return {
    get: function(threshold){
      var sql = "SELECT cool.id, cool.score, cool.data FROM cool WHERE cool.score > " + threshold;
      if (!ss.arbStore) {
            console.log("connecting to mysql arb data store");
            ss.coolStore = ss.coolStore.connect();
      }

      ss.coolStore.query(sql, function(err, rows, fields) {
            if(err) {
                    console.log("error fetching stuff", err);
            } else {
                    console.log("first row = "+rows[0].id);
            }
      });
      var db_rows = ???
      return res(null, db_rows || []);
    }
  }

The console logs the id of my database entry, as expected. However, I am clueless how I can make the Rpc's return statement return the rows of my query. What is the right way of addressing this sort of problem?

Thanks for your help. Please be friendly with me, because this is also my first question on stackoverflow.


Solution

  • It's not synchronous. When your results are ready, you can send them back:

    exports.actions = function (req, res, ss) {
    
      // use session middleware
      req.use('session');
    
      return {
        get: function(threshold){
          ...
          ss.coolStore.query(sql, function(err, rows, fields) {
            res(err, rows || []);
          });
        }
      }
    };
    

    You need to make sure that you always call res(...) from an RPC function, even when an error occurs, otherwise you might get dangling requests (where the client code keeps waiting for a response that's never generated). In the code above, the error is forwarded to the client so it can be handled there.