2013-09-22 46 views
2

我創建了一個簡單的應用程序,試圖集成node,express,socket.io和jade。用戶在文本字段中輸入一些字符串(「工具ID」)並單擊提交按鈕。該文本只是簡單地轉換爲全部大寫,結果將附加到頁面上的結果部分。結果應該自動更新爲查看頁面的其他客戶端。爲什麼客戶端在node + express + socket.io + jade簡單應用程序中斷開連接並重新連接

它主要工作。然而,問題在於,在用戶單擊頁面上的提交按鈕以提交工具ID之後,節點控制檯和瀏覽器JavaScript控制檯都顯示客戶端斷開連接並重新連接。

對用戶來說,它看起來像結果正確地更新了幾分之一秒。然後結果在另一小部分時間內變爲空白。然後結果重新顯示。由於我使用結果顯示用戶的會話ID,因此我可以看到會話ID在短時間內變化,而結果變爲空白。

請注意,如果一個不同的客戶端只是查看該頁面,但沒有以其他方式進行交互,結果會平穩更新(結果沒有短暫的時間變爲空白),並且該客戶端似乎根本沒有斷開連接。

我不希望客戶端在他們單擊表單上的提交按鈕時斷開連接並重新連接。有人能告訴我爲什麼會發生這種情況,我應該如何正確地做到這一點?

app.js(服務器)

var express = require('express'); 
var app = express(); 
var http = require('http'); 
var server = http.createServer(app); 
io = require('socket.io').listen(server); // without the var, this becomes available to other files like routes. 
var path = require('path'); 
var routes = require('./routes/routes'); 
var process = require('./routes/process'); 
var _ = require("underscore"); 

// all environments 
app.set('port', 3097); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.favicon()); 
//app.use(express.logger('dev')); 
app.use(express.bodyParser()); //Tells server to support JSON, urlencoded, and multipart requests 
app.use(express.methodOverride()); 
app.use(express.cookieParser('i7iir5b76ir857bveklfgf')); 
app.use(express.session()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 

var toolIDs = []; 

// development only 
if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

io.on("connection", function(socket) { 
    console.log("Client connected. Sending Update"); 

    socket.on("toolsRequest", function() { 
     socket.emit('toolsReady', {toolIDs: toolIDs}); //This should go to the client that just connected. 
    }); 

    socket.on("disconnect", function() { 
     console.log("Client Disconnected"); 
    }); 

    socket.on("toolsUpdate", function(data) { 
     processedToolID = process.process(data.toolID); 
     toolIDs.push({id: data.id, inputToolID: data.toolID, outputToolID: processedToolID}); 
     io.sockets.emit("toolsUpdated", {toolIDs: toolIDs}); //This should go to all clients 
     console.log('Results Updated - notifying all clients'); 
    }); 
}); 

// display main page 
app.get('/', routes.home); 

server.listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

routes.js

/* 
* GET home page. 
*/ 

exports.home = function(req, res){ 
    res.render('home', { title: 'Tool'}); 
    console.log("Just called route.home"); 
}; 

home.jade

doctype 5 
html 
    head 
     title= title 
     link(rel='stylesheet', href='/bootstrap/css/bootstrap.min.css') 
     link(rel='stylesheet', href='/bootstrap/css/bootstrap-responsive.min.css') 
     script(src='/socket.io/socket.io.js') 
     script(src="http://code.jquery.com/jquery.min.js") 
     script(src='/js/index.js') 
block content 
    #wrapper 
    h1 
     a(href='/') TOOL 
    #display 
     div.row-fluid 
      div.inlineBlock 
       form#toolForm 
        label Tool ID 
        input(type="text", placeholder="e.g. abc123")#toolID 
        span.help-block You may enter a string. 
        button(class="btn")#submit 
         | Submit 
       br 
      div.inlineBlock.topAligned 
       h2 Results 
       br 
       div#results 
       br 

個index.js(客戶端)

function init() { 

    /* 
    On client init, try to connect to the socket.IO server. 
    */ 
    var socket = io.connect('http://example.com:3097/'); 

    //We'll save our session ID in a variable for later 
    var sessionID = ''; 

    //Helper function to update the results 
    function updateResults(toolIDs) { 
     $('#results').html(''); 
     for (var i = 0; i < toolIDs.length; i++) { 
      $('#results').append('<span id="' + toolIDs[i].id + '">' + '<b>Creator ID:</b> ' + toolIDs[i].id + ' <b>Your ID:</b> ' + sessionID + ' <b>Input Tool:</b> ' + toolIDs[i].inputToolID + ' <b>Output Tool:</b> ' + toolIDs[i].outputToolID + (toolIDs[i].id === sessionID ? '<b>(You)</b>' : '') + '<br /></span>'); 
     } 
    } 

    /* 
    When the client successfully connects to the server, an 
    event "connect" is emitted. 
    */ 
    socket.on('connect', function() { 
     sessionID = socket.socket.sessionid; 
     // Note this appears in the browser Javascript console, not node console 
     console.log('You are connected as: ' + sessionID);  
     socket.emit('toolsRequest'); //Request the tools data so we can update results 
    }); 

    socket.on('toolsReady', function(data) { 
     updateResults(data.toolIDs); 
     console.log('Results have been updated from socket.on.toolsReady'); 
    }); 

    socket.on('toolsUpdated', function (data) { 
     updateResults(data.toolIDs); 
     console.log('Results updated from socket.on.toolsUpdated'); 
    }); 

    /* 
    Log an error if unable to connect to server 
    */ 
    socket.on('error', function (reason) { 
     console.log('Unable to connect to server', reason); 
    }); 

    function getCitations() { 
     var toolID = $('#toolID').val() 
     socket.emit('toolsUpdate', {id: sessionID, toolID: toolID}); 
    } 

    $('#submit').on('click', getCitations); 
} 

$(document).on('ready', init); 

下面是我在節點控制檯看到當客戶點擊提交按鈕:

debug - websocket writing 5:::{"name":"toolsUpdated","args":[{"toolIDs":[{"id":"5a1dfX2dmxcogYT_11e8","inputToolID":"a123123","outputToolID":"A123123"},{"id":"OIuqao6TsTeddQm111e-","inputToolID":"1abcdefg","outputToolID":"1ABCDEFG"},{"id":"Qr_YQ2ZhQHbDpBlk11e_","inputToolID":"abcdefg","outputToolID":"ABCDEFG"}]}]} 
Results Updated - notifying all clients 
Just called route.home 
    info - transport end (socket end) 
    debug - set close timeout for client Qr_YQ2ZhQHbDpBlk11e_ 
    debug - cleared close timeout for client Qr_YQ2ZhQHbDpBlk11e_ 
    debug - cleared heartbeat interval for client Qr_YQ2ZhQHbDpBlk11e_ 
Client Disconnected 
    debug - discarding transport 
    debug - served static content /socket.io.js 
    debug - client authorized 
    info - handshake authorized 2bPKGgmLdD4fp-vz11fA 
    debug - setting request GET /socket.io/1/websocket/2bPKGgmLdD4fp-vz11fA 
    debug - set heartbeat interval for client 2bPKGgmLdD4fp-vz11fA 
    debug - client authorized for 
    debug - websocket writing 1:: 
Client connected. Sending Update 
    debug - websocket writing 5:::{"name":"toolsReady","args":[{"toolIDs":[{"id":"5a1dfX2dmxcogYT_11e8","inputToolID":"a123123","outputToolID":"A123123"},{"id":"OIuqao6TsTeddQm111e-","inputToolID":"1abcdefg","outputToolID":"1ABCDEFG"},{"id":"Qr_YQ2ZhQHbDpBlk11e_","inputToolID":"abcdefg","outputToolID":"ABCDEFG"}]}]} 

謝謝,我很欣賞的幫助。

回答

1

您的提交按鈕實際上是重新加載頁面,這就是套接字斷開連接的原因,以及爲什麼您在如此短的時間內看到套接字響應。只需防止提交按鈕的默認操作。更改此:

$('#submit').on('click', getCitations); 

爲了類似的東西:

$('#submit').click(function(event) { 
    event.preventDefault(); 
    getCitations(); 
}); 
+0

謝謝,沒有的伎倆! – braincog

相關問題