及昨天的工作,正在寫一個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); }); }
有待分析。。。