2014-09-19 5 views
2

Пробую мою руку с node.js в первый раз, создав простое приложение чата в режиме реального времени, как и все остальные.Node.js, socket.io: получение дубликатов запросов от каждого вызова socket.io

У вас возникли проблемы с этим и последние ~ 2 часа не могут найти решение/причину для него.

У меня возникла эта проблема из моего приложения чата, каждый отдельный запрос на сервер будет дублироваться, поэтому сообщения появятся дважды, в консоли сервер соединения будет записывать дважды. Я реализовал несколько решений, так как есть пара подобных проблем, но здесь нет проблем.

Я попытался воссоздать проблему в новом тестовом приложении, чтобы узнать, могу ли я найти то, что я сделал неправильно. Код

Серверный код

var express = require('express'); 
 
var routes = require('./routes'); 
 
var path = require('path'); 
 
var http = require('http'); 
 

 
var app = module.exports = express(); 
 
var server = require('http').createServer(app); 
 
var io = require('socket.io').listen(server); 
 

 
app.set('port', 1620); 
 
app.use(express.logger('dev')); 
 
app.use(express.methodOverride()); 
 
app.use(express.static(path.join(__dirname, 'public'))); 
 
app.use(app.router); 
 
app.set('views', __dirname + '/views'); 
 
app.engine('html', require('ejs').renderFile); 
 

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

 
app.get('/', routes.index); 
 

 
io.sockets.on('connection', function (socket) { 
 
    socket.on('test', function (data) { 
 
     console.log('Test.' + data);    
 
    }); 
 
}); 
 

 
server.listen(app.get('port'), app.get('ipaddr'), function() { 
 
    console.log('Express server listening on IP/hostname: "' + app.get('ipaddr') + '" and port: "' + app.get('port') + '"'); 
 
});

Клиент:

'use strict'; 
 
angular.module('chatter', []); 
 

 
angular.module('chatter').controller('chatterCtrl', [ 
 
    '$scope', '$http', function ($scope, $http) { 
 
    
 
    $scope.test = 'Hello'; 
 
    
 
    var socket = io.connect(); 
 
    
 
    $scope.sendTest = function() { 
 
     socket.emit('test', 'ThisIsATest'); 
 
    } 
 
} 
 
]);

Где $ scope.sendTest привязан к кнопке мыши.

Вот лог консоли ...

(не позволит мне размещать фото)

Test.1 
Test.1 
Test.2 
Test.2 
Test.3 
Test.3 
Test.4 
Test.4  
Test.5 
Test.5 
Test.6 
Test.6 

В отличие от других вопросов, это похож проблема не связана;

  • Для FavIcon называют (есть express.favicon, это происходит каждый вызов и во всех браузерах)
  • Для обработчика событий который вызывается много раз, запрос всегда только дублированы, не имеет значения, если 4 клиента подключаются или обновляется запрос, который вызывается только дважды.

Может ли кто-нибудь увидеть из моего кода, в чем проблема? И если вы запустите этот код, вы получите тот же результат?

Cheers.

+1

Моя первая мысль заключается в том, что ваш угловой контроллер выполняется дважды. – Incognito

+2

Если вы запустите это в отладчике, например, отладчике chrome, вы можете видеть из сетевого трафика, если данные отправляются по кабелю дважды? – aembke

+0

Похоже, вы правы. Невозможно увидеть какие-либо сетевые вызовы в отладчике Chrome (возможно, это потому, что это веб-сайты?), Но применение точки останова к коду щелчка кнопки показывает, что он дважды ударяется. – MaxJ

ответ

0

Как видно из комментариев, проблема не имела ничего общего с node.js/socket.io, как я думал, проблема заключалась в том, что я дважды объявил свой угловой сценарий, в результате чего мой угловой контроллер дважды вызывался на все.

<script src="~/Scripts/angular.js" type="text/javascript"></script> 
    <script src="~/Scripts/angular.js" type="text/javascript"></script> 

Устранение дубликата декларации устраняет проблему.