套接字streamasynchronous调用到rpc行动内的MySQL

首先,我需要告诉你,我对nodejs,socketstream,angularjs和JavaScript的奇观一般都很陌生。 我来自Java背景,这可能解释我对做asynchronous的正确方式的无知。

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

以下是我使用socketstream 0.3所做的工作:

在app.js我成功地告诉ss允许我的mysql数据库连接通过把ss.api.add('coolStore',mysqlConn); 在那里在正确的地方( 正如在socketstream文档中所解释的 )。 我使用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 || []); } } 

控制台按预期logging我的数据库条目的ID。 但是,我很无能,我可以使Rpc的返回语句返回我的查询的行。 解决这类问题的正确方法是什么?

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

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

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

您需要确保始终从RPC函数中调用res(...) ,即使发生错误时也是如此,否则可能会发生悬而未决的请求(客户端代码始终在等待从未生成的响应)。 在上面的代码中,错误被转发给客户端,所以可以在那里处理。