首先,我需要告诉你,我对 nodejs、socketstream、angularjs 和 JavaScript 的奇妙之处总体上还很陌生。我来自 Java 背景,这可能解释了我对异步处理的正确方法一无所知。
为了玩弄我从 americanyak 安装的 ss-angular-demo。我现在的问题是 Rpc 似乎是一个同步接口(interface),而我对 mysql 数据库的调用有一个异步接口(interface)。如何在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 上的第一个问题。
最佳答案
这不是同步的。当您的结果准备就绪时,您可以将它们发回:
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(...)
,即使发生错误,否则您可能会收到悬空请求(客户端代码一直在等待)从未生成的响应)。在上面的代码中,错误被转发到客户端,因此可以在那里进行处理。
关于mysql - rpc 操作中对 mysql 的 socketstream 异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15861879/