为什么我的代码在Node中断开Socket.io连接?

首先抱歉,我不是母语英语,并感谢您的兴趣! 我不知道为什么当我对数组执行一些半重操作时,我的浏览器断开与Socket.io的连接。 浏览器收到断开事件,然后重新连接,但不应该首先断开连接。

代码包含一对嵌套的循环,我知道这不是最好的做法,但我没有find任何其他的方式来完成任务。 我开始testing大数组用户(大约10k),并且问题开始发生,所以我想这是一个性能问题。

我试图find内存韭菜,但没有成功,它几乎像执行操作的应用程序冻结和打破了Socket.io的时间。

感谢您的帮助。

var pushUsersToCorrectLeagues = function(appConfig, callback, usersArray, newSeason, db) { //determinate which league is the last one var leaguesOrderArray = []; _.each(newSeason.leagues, function(league) { leaguesOrderArray.push(league.key); return false; }); var lastLeagueKey = _.last(leaguesOrderArray.sort(function(a, b) { return a - b; })); _.each(usersArray, function(user) { var keyUserData = {}; keyUserData.userLogin = user.userLogin; keyUserData._id = user._id; keyUserData.avatarUrl = user.avatarUrl; keyUserData.isActive = true; keyUserData.scores = {}; //now put users in correct leagues var userPushed = false; var endedInLeague = null; //if found a user in league _.each(newSeason.leagues, function(league) { _.find(league.users, function(alredyInLeagueUser, i) { if (alredyInLeagueUser.userLogin == user.userLogin) { newSeason.leagues[league.key].users[i] = keyUserData; userPushed = true; endedInLeague = league.key; return true; } }); return false; }); //user wasnt found in any league, has to be pushed to the last one then if (!userPushed) { newSeason.leagues[lastLeagueKey].users.push(keyUserData); endedInLeague = lastLeagueKey; } if (endedInLeague) { process.nextTick(function() { var callback = function(updatedUser) { //console.log('updatedUser', updatedUser); return false; }; updateUserCurrentLeague(callback, user._id, endedInLeague, db); }); } return false; }); callback(usersArray, newSeason); return false; }; 

这听起来像你的操作比套接字心跳间隔更长,因此连接的一端认为连接已经被丢弃。

你有以下select:

  1. 您可以延长套接字的心跳间隔(实际上只是一个bandaid,而不是最好的修复)。
  2. 您可以将耗时的节点操作卸载到subprocess,并让它运行,收集结果并以JSONforms发回结果。 这使您的主节点进程始终保持响应。
  3. 您可以将耗时的操作分解为每个块不超过500ms运行的块,然后服务器可以在耗时的操作过程中处理其他事件。 这需要重新处理如何处理的东西,因为你不能使用.each()循环。 相反,你必须在某个地方存储一些状态,使用计数器,做一定的工作,更新状态,设置一个计时器,在处理其他事件之后做一些其他的工作,做另一个工作,重复,直到所有的工作完成。

仅供参考,下面是一个如何处理一个非常大的数组块的例子: 最好的方式来遍历数组而不会阻塞UI 。 这是编码为浏览器,但概念是相同的节点。