pomelo-cn
pomelo-cn copied to clipboard
request "chat.chatHandler.send" timeou
1. servers.json
- 在gate 中设置了connector 和chat 的关系
Handler.prototype.queryEntry = function(msg, session, next) { var name = msg.name; var pwd = msg.pwd; if(!name || !pwd){ next(null,{code:Code.FAIL}); return; }
var self = this;
userDao.getUserByName(name,function(err,user){
if(err){
next(null,{code:Code.FAIL});
return;
}
var uid = user.id;
if(!uid) {
next(null, {code: Code.FAIL});
return;
}
var connectors = self.app.getServersByType('connector');
if(!connectors || connectors.length === 0) {
next(null, {code: Code.GATE.NO_SERVER_AVAILABLE});
return;
}
var tk = Token.create(uid, Date.now(), secret);
var res = dispatcher.dispatch(uid, connectors);
next(null, {code: Code.OK, host: res.host, port: res.clientPort,token:tk,uid:user.id});
});
};
- 开始进入 connector.entryHandler.entry ,代码如下
pro.entry = function(msg, session, next) { var token = msg.token; var self = this;
if(!token) {
next(new Error('invalid entry request: empty token'), {code: Code.FAIL});
return;
}
var uid, players, player;
async.waterfall([
function(cb) {
// auth token
self.app.rpc.auth.authRemote.auth(session, token, cb);
}, function(code, user, cb) {
// query player info by user id
if(code !== Code.OK) {
next(null, {code: code});
return;
}
if(!user) {
next(null, {code: Code.ENTRY.FA_USER_NOT_EXIST});
return;
}
uid = user.id;
userDao.getPlayersByUid(user.id, cb);
}, function(res, cb) {
// generate session and register chat status
players = res;
self.app.get('sessionService').kick(uid, cb);
}, function(cb) {
session.bind(uid, cb);
session.set('rid', uid);//session.settings[rid] = rid;
session.push('rid', function(err) {
if(err) {
console.error('set rid for session service failed! error is : %j', err.stack);
}
});
}, function(cb) {
if(!players || players.length === 0) {
next(null, {code: Code.OK});
return;
}
player = players[0];
session.set('serverId', self.app.get('areaIdMap')[player.areaId]);
session.set('playername', player.name);
session.set('playerId', player.id);
session.on('closed', onUserLeave.bind(null, self.app));
session.pushAll(cb);
}, function(cb) {
self.app.rpc.chat.chatRemote.add(session, uid, player.name,channelUtil.getGlobalChannelName(), cb);
next(null,{code:Code.OK,player:player});
}
], function(err) {
if(err) {
next(err, {code: Code.FAIL});
return;
}
next(null, {code: Code.OK, player: players ? players[0] : null});
});
};
4 在app.js 设置了
app.route('chat',routeUtil.chat);
routeUtil.chat 的代码如下: exp.chat = function(session, msg, app, cb) { var chatServers = app.getServersByType('chat');
if(!chatServers || chatServers.length === 0) {
cb(new Error('can not find chat servers.'));
return;
}
var res = dispatcher.dispatch(session.get('rid'), chatServers);
cb(null, res.id);
};
- 在客户端(flash 端)访问 chat.chatHandler,send 。 就跑异常 [2013-10-17 14:47:39.682] [INFO] [default] - [2013-10-17 14:47:39.675] [WARN] \node_modules\pomelo\lib\filters\handler\timeout.js - request "chat.chatHandler.send" timeout.
我跟踪发现, gateHandler 分配的是connector-server-1, 在routeUtil.chat 中拿到的是chat-server-1 , 是不是这样导致了问题,希望知道的朋友给个解释,先感谢了!
不是这个原因,request请求到达handler超时导致,你应该是在app.js里面设置了timeout 这个filter,检查一下服务器是不是正常启动。
你的代码逻辑判断有问题: Handler.prototype.queryEntry = function(msg, session, next) { var name = msg.name; var pwd = msg.pwd; if(!name || !pwd){ next(null,{code:Code.FAIL}); return; }
只有当next被调用的时候,客户端才能接收到信息,看看你的代码,只当用户名或密码为空的时候发送消息 if(!name || !pwd){ next(null,{code:Code.FAIL}); return; }
那么不为空的时候呢?应该这么写: if(!name || !pwd){ next(null,{code:Code.FAIL}); return; } next(null,{code:Code.OK}); 意思是为空的时候发送FAIL,不为空的时候发送OK