【发布时间】:2017-09-11 19:23:13
【问题描述】:
我正在tail输入日志文件并将新行流式传输到 websocket。
由于我有多个日志,我让用户选择日志文件,然后获取该日志的详细信息。
问题是,当我关闭连接以查看不同的日志时,连接会做一些奇怪的事情,当我再次启动它时,它会两次传输数据。如果我关闭连接并重新打开它,它会传输 3 倍的数据,依此类推。
我的package.json:
{
"socket.io": "^2.0.3",
"socket.io-client": "^2.0.3"
}
客户端
$("#detailsBtn").click(function (e) {
e.preventDefault();
$.get('/get/details', {
// some-data
}, () => {
if (socket) socket.close();
socket = io('http://localhost:4000', {forceNew: true});
socket.on('connect', () => {
console.log('connected');
});
socket.on('newLine', function (msg) {
// do-stuff
});
});
});
$('#closeBtn').click(function () {
socket.disconnect();
socket.close();
});
服务器端
app.get('/details', (req, res) => {
const tail = spawn('ssh', ['root@' + req.query.srv, req.query.script]);
io.on('connection', function (socket) {
console.log(`connect ${socket.id}`);
socket.on('disconnect', () => {
console.log(`DISconnected ${socket.id}`);
});
tail.stdout.on('data', function (data) {
socket.emit('newLine', {message: data});
});
});
return res.sendStatus(200);
});
现在在模拟按钮点击时,我希望套接字和连接关闭,以便创建一个新的。
服务器控制台日志(每次我只点击一次按钮)
Server listening on localhost:4000
**click on detailsBtn**
GET /get/details?srv=myserver.google.com&script=%2Fusr%2Fbin%2Ftail 304 16.003 ms - -
connect YyYHFI9CARpBHaxoAAAB
**click on closeBtn**
DISconnected YyYHFI9CARpBHaxoAAAB
**click on detailsBtn**
GET /get/details?srv=myserver.google.com&script=%2Fusr%2Fbin%2Ftail 304 6.308 ms - -
connect vzfBnUPHUqYXd5qaAAAC
connect vzfBnUPHUqYXd5qaAAAC
**click on closeBtn**
DISconnected vzfBnUPHUqYXd5qaAAAC
DISconnected vzfBnUPHUqYXd5qaAAAC
**click on detailsBtn**
GET /get/details?srv=myserver.google.com&script=%2Fusr%2Fbin%2Ftail 304 4.677 ms - -
connect 3quEe5G1gFDJ2BvrAAAD
connect 3quEe5G1gFDJ2BvrAAAD
connect 3quEe5G1gFDJ2BvrAAAD
**click on closeBtn**
DISconnected 3quEe5G1gFDJ2BvrAAAD
DISconnected 3quEe5G1gFDJ2BvrAAAD
DISconnected 3quEe5G1gFDJ2BvrAAAD
我做错了什么?
【问题讨论】:
-
这样的症状通常是由重复的事件处理程序引起的。