2014-06-11 7 views
21

Próbuję dodać plik socket.io do mojej istniejącej aplikacji node.js w trybie ekspresowym. Dodałem socket.io bibliotekę na stronie serwera w następujący sposób (bezpośrednio po http://socket.io/get-started/chat/):Połączenie Socket.io powraca do odpytywania, nigdy nie uruchamia modułu obsługi połączenia

var express = require('express') 
    , http = require('http') 
    , path = require('path') 
    , fs = require('fs'); 

var app = express(); 
var http = http.Server(app); 
var io = require('socket.io')(http); 

// Express settings [...] 
// Express routes [...] 

// Socket.io Communication 
io.on('connection', function(socket) { 
    console.log('a user connected'); 
}); 


// Start server 
app.listen(config.port, function() { 
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env')); 
}); 

Teraz na front-end Ja po prostu wykonaniu połączenia:

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var io = io(); 
</script> 

Zamiast wyświetlać w konsoli "użytkownika połączonego", konsola rejestruje ciągły strumień ankiet. Używam najnowszej wersji Chrome na Macu, która obsługuje strony internetowe.

GET /socket.io/?EIO=2&transport=polling&t=1402521519446-91 200 94ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519447-92 200 93ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519485-93 200 53ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519580-94 200 143ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519582-95 200 144ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519633-96 200 40ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519778-97 200 92ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519780-98 200 92ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519818-99 200 36ms - 6.96kb 
GET /socket.io/?EIO=2&transport=polling&t=1402521519912-100 200 81ms - 6.96kb 
[etc] 

Muszę coś zrobić nie tak. Jestem całkiem nowy w tym i chciałbym, aby wskazano mi właściwy kierunek. Daj mi znać, jeśli muszę opracować jakąkolwiek część tego pytania.

Dzięki! - Edward

===========

EDIT:

Oto ustawienia ekspresowych obecnie używam. Próbowałem wykonać te same kroki w zupełnie nowej aplikacji węzła i wszystko działało dobrze, więc zastanawiam się, czy to nie jest problem.

app.configure('development', function(){ 
    app.use(require('connect-livereload')()); 

    // Disable caching of scripts for easier testing 
    app.use(function noCache(req, res, next) { 
     if (req.url.indexOf('/scripts/') === 0) { 
      res.header('Cache-Control', 'no-cache, no-store, must-revalidate'); 
      res.header('Pragma', 'no-cache'); 
      res.header('Expires', 0); 
     } 
     next(); 
    }); 

    app.use(express.bodyParser({limit: '50mb'})); // increase limit for audio recordings 
    app.use(express.static(path.join(config.root, '.tmp'))); 
    app.use(express.static(path.join(config.root, 'app'))); 
    app.use(express.errorHandler()); 
    app.use(express.logger('dev')); 

    util.logger.add(loggly, { 
     [...Credentials...] 
    }); 
    app.set('views', config.root + '/app/views'); 
}); 

Odpowiedz

26

miałem ten sam problem i sposób, w jaki sposób rozwiązać to było przez zastąpienie tego

// Start server 
app.listen(config.port, function() { 
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env')); 
}); 

z tym:

// Start server 
http.listen(config.port, function() { 
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env')); 
}); 

Ten post trochę wyjaśnia dlaczego: https://stackoverflow.com/a/17697134/1515130

-8

Nie wiem, czy to jest twój problem, ale moje oko utknęło na twoim znaczniku skryptu HTML, z tą ścieżką źródłową js.

<script src="/socket.io/socket.io.js"></script> 

Myślę, że obsługa folderów nie jest właściwa. Powinno być:

<script src="./socket.io/socket.io.js"></script> 

Albo:

<script src="socket.io/socket.io.js"></script> 

Bo moim zdaniem „/” na początku odnosi się do folderu głównego. "./" odnosi się do bieżącego katalogu i następnego, ale po prostu nazwa folderu, a następnie js wewnątrz powinno wystarczyć.

Twój kod jest prawidłowy, ale strona html po stronie klienta nie zawiera twojego skryptu.

+3

gniazdka. kod klienta Io jest oczywiście załadowany, lub OP nie widziałby żądań XHR. –

+0

Po dołączeniu pliku socket.io do aplikacji serwera. Socket io udostępnia bibliotekę po stronie klienta w /socket.io/socket.io.js – stujo

Powiązane problemy