首先,我需要告诉你的是,我对nodejs,socketstream,angularjs和JavaScript的奇迹还很陌生。我来自Java背景,这可能解释了我对异步处理的正确方式的无知。
为了玩弄一些东西,我安装了americanyak的ss-angular-demo。我现在的问题是,Rpc似乎是一个同步接口,而我对mysql数据库的调用有一个异步接口。如何在调用Rpc时返回数据库结果?
以下是我到目前为止对socketstream 0.3所做的工作:
在app.js中,我通过将ss.api.add('coolStore',mysqlConn);
放在正确的位置(as explained in the socketstream docs),成功地告诉ss允许访问我的mysql数据库连接。我使用mysql npm,因此可以在Rpc中调用mysql
server/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的第一个问题。
发布于 2013-04-07 20:12:38
它不是同步的。当你的结果准备好后,你可以把它们发回去:
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(...)
,即使在发生错误时也是如此,否则可能会收到悬而未决的请求(客户端代码一直在等待从未生成的响应)。在上面的代码中,错误被转发到客户端,因此可以在那里进行处理。
https://stackoverflow.com/questions/15861879
复制相似问题