所以,我有一个节点服务器,运行expressjs io(使用socket.io),我正在构建一个跟踪数据库中坐标的网格地图。
只是,我遇到了一个特殊的问题,因为我的插座只能听有时。
起初没有错误消息,只是偶然我让页面运行,我收到了这个错误。
Uncaught TypeError: Cannot call method '0' of undefined UkPS99A_w96Ae0K570Nt?t=1395276358213&i=0:1
当我点击文件UkPS99A_w96Ae0K570Nt?t=1395276358213&i=0:1
时,我会收到以下代码:
io.j[0]("8::");
如果我刷新页面,每隔几次它就会突然找到大约10次平铺点击,然后它就会停止工作。我的数据库正在正确更新,直到套接字基本消失。
这是我在地图中发送坐标的地方:
io.emit("move", {x:this.x,y:this.y});
服务器监听:
app.io.route('move', function(req) {
con.getConnection(function(err){
if (err) console.log("Get Connection Error.. "+err);
//removed query because redundant
req.io.emit("talk", {x:req.data.x,y:req.data.y});
});
});
和我的套接字脚本:
io.on("talk",function(data) {
console.log(data.x,data.y);
});
我的脚本包含在此页面的底部:
<script src="socket.io/socket.io.js"></script>
<script>io = io.connect();</script> <!-- open the socket so the other scripts can use it -->
<script src="../js/sock.js"></script>
<script src="../js/map.js"></script>
我有什么问题,套接字似乎失去连接并引发某种错误吗?
更新:我让服务器运行时间更长,并且在我的控制台中弹出了更多错误消息:
Uncaught TypeError: Cannot call method 'close' of null socket.io.js:1967
Uncaught TypeError: Cannot call method 'close' of null socket.io.js:1967
Uncaught TypeError: Cannot call method 'onClose' of null
更新更新:更改了连接线并将正确的CORS添加到我的server.js
io = io.connect('http://sourceundead.com', {resource : 'socket.io'});
仍然是同一个问题。
答案 0 :(得分:3)
您似乎有一个连接损耗,因为您从未将它们释放到池中。
假设con
是您的池的(坏)名称,而不是
app.io.route('move', function(req) {
con.getConnection(function(err){
if (err) console.log("Get Connection Error.. "+err);
//removed query because redundant
req.io.emit("talk", {x:req.data.x,y:req.data.y});
});
});
你应该有像
这样的东西app.io.route('move', function(req) {
con.getConnection(function(err, connection){
if (err) console.log("Get Connection Error.. "+err);
//removed query because redundant
req.io.emit("talk", {x:req.data.x,y:req.data.y});
connection.release();
});
});
请注意,必须小心使用连接以确保它们始终释放,并且在您有一个处理错误时特别有点麻烦执行任务时要做的几个查询。
在某些时候,您可能希望使用promises来使这更容易。这是关于using bound promises to ease database querying in node.js的博客文章。