1

首先,我需要告诉你,我对 nodejs、socketstream、angularjs 和 JavaScript 的奇迹非常陌生。我来自 Java 背景,这可能解释了我对异步做事的正确方式的无知。

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

这是我到目前为止使用 socketstream 0.3 所做的:

ss.api.add('coolStore',mysqlConn);在 app.js 中,我成功地告诉 ss 允许通过在正确的位置放置我的 mysql 数据库连接来访问(如 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 || []);
    }
  }

控制台按预期记录了我的数据库条目的 ID。但是,我不知道如何使 Rpc 的 return 语句返回我的查询行。解决此类问题的正确方法是什么?

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

4

1 回答 1

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 函数调用,即使发生错误也是如此,否则您可能会收到悬空请求(客户端代码一直在等待从未生成的响应)。在上面的代码中,错误被转发给客户端,以便在那里进行处理。

于 2013-04-07T12:12:38.437 回答