2013-04-07 52 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