及昨天的工作,正在寫一個redis的業務操作模塊。RedisManager。過程是 先從一個Set里查出所有 openId 然后循環查出 openId對應的User對象。
代碼如下:
var EventProxy = require('eventproxy');
var client = require('./RDB');
function RedisManager(){}
module.exports = RedisManager;
/**
* 根據openid獲得用戶Hash
* @param openid
* @param callback
*/
RedisManager.getUserByOpenId = function getUserByOpenId(openId, callback){
client.auth('aFu1hvCV5ks1G9jjx5J8');
console.log('OpenId--'+openId);
var key = 'user:'+openId+':id';
client.get(key, function (err, obj) {
if(err)
throw err;
var userId = obj;
console.log('UserId--'+userId);
RedisManager.getUserByid(userId, callback);
});
}
/**
* 根據userid獲取用戶Hash
* @param id
* @param callback
*/
RedisManager.getUserByid = function getUserByid(id, callback){
getUserByid(id, callback);
}
/**
* getUserByid
* @param id
* @param callback
*/
function getUserByid(id, callback){
var key = 'user:'+id;
console.log('User by Id--'+key);
client.hgetall(key, function (err, obj) {
if(err)
console.log(err);
console.log('get User by Id--'+obj);
callback(err, obj);
});
}
杯具來了。。。字面翻譯:rangeerror:最大調用堆棧大小超過
RangeError: Maximum call stack size exceeded
不會吧。。。我沒做什么遞歸操作啊,最多就是回調多了幾層,不過在node里很常見啊。於是百度之。發現了如下一片文章
http://blog.csdn.net/vean_system/article/details/7799232
沒怎么看懂的說....不過初步認定好像是 方法調用有問題。這時突然發現,這個方法是調用了一個同名本地方法getUserByid,難道是這個問題引起的?
RedisManager.getUserByid = function getUserByid(id, callback){
getUserByid(id, callback);
}
嘗試把getUserByid方法直接寫在 類的導出方法中,居然運行通過了~看來果然是這樣,不過javascript功底有限,還不清楚到底為什么會出現這種情況。
RedisManager.getUserByid = function getUserByid(id, callback){
var key = 'user:'+id;
console.log('User by Id--'+key);
client.hgetall(key, function (err, obj) {
if(err)
console.log(err);
console.log('get User by Id--'+obj);
callback(err, obj);
});
}
有待分析。。。
