2013-04-07 56 views
1

首先,我需要告诉你,我对nodejs,套接字流,angularjs和JavaScript的奇观一般都很陌生。我来自Java背景,这可能解释我对做异步事情的正确方式的无知。在rpc动作中将套接字流异步调用到mysql

为了玩弄我从americanyak安装ss-angular-demo的东西。我现在的问题是,Rpc似乎是一个同步接口,而我的调用mysql数据库有一个异步接口。如何在Rpc调用后返回数据库结果?

这里是我做的,到目前为止有socketstream 0.3:

在app.js我成功告诉SS,让我的mysql数据库连接,通过将ss.api.add('coolStore',mysqlConn);在那里在正确的地方(as explained in the socketstream docs)进行访问。我用的是mysql NPM,这样我就可以在RPC

服务器中调用的mysql/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 || []); 
    } 
    } 

控制台登录我的数据库条目的ID,符合市场预期。但是,我无法如何让Rpc的return语句返回查询的行。解决这类问题的正确方法是什么?

感谢您的帮助。请和我友好,因为这也是我在stackoverflow上的第一个问题。

回答

1

它不同步。当你的结果准备好了,你可以向他们发送回:

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 || []); 
     }); 
    } 
    } 
}; 

你需要确保你随时调用res(...)从RPC功能,即使出现错误,否则你可能会晃来晃去的请求(其中客户端代码一直在等待从未生成的响应)。在上面的代码中,错误被转发给客户端,以便在那里处理。

+0

谢谢!噢,我的......毕竟是那么简单。 – luksch 2013-04-07 12:23:18