2016-08-30 6 views
1

Socket.io 1.0とAngular 2.0.0-rc.5とExpress 4を使用しています。彼らは複数回放送され、最初のイベントだけがメッセージを持っています。そこら中にconsole.logを使用すると、私はSocket.io Angular 2イベントを2回発生する

ビン/ WWW

#!/usr/bin/env node 

/** 
* Module dependencies. 
*/ 

var app = require('../app'); 
var debug = require('debug')('a2-test:server'); 
var http = require('http'); 

/** 
* Get port from environment and store in Express. 
*/ 

var port = normalizePort(process.env.PORT || '4000'); 
app.set('port', port); 

/** 
* Create HTTP server. 
*/ 

var server = http.createServer(app); 

var io = require('socket.io')(server); 

io.on('connection', function (socket) { 

    console.log('a user connected', socket.id); 

    socket.on('add-message', (message) => { 
    console.log('broadcast', socket.id, message) 
    io.emit('message', {text: message}) 
    }); 
}); 

/** 
* Listen on provided port, on all network interfaces. 
*/ 

server.listen(port); 
server.on('error', onError); 
server.on('listening', onListening); 

chat.component.ts を( '・メッセージを追加')それが唯一のbin /にwww socket.on内の複数のログを生成し伝えることができます

export class ChatComponent implements OnInit, OnDestroy { 
    messages = []; 
    connection; 
    message; 

    constructor(private chatService: ChatService) { 

    } 

    sendMessage() { 
     this.chatService.sendMessage(this.message); 
     this.message = ''; 
    } 

    ngOnInit() { 
     this.connection = this.chatService.getMessages().subscribe(
      (msg) => { 
       this.messages.push(msg) 
      }); 
    } 

    ngOnDestroy() { 
     this.connection.unsubscribe(); 
    } 
} 

chat.service.ts

import { Subject } from 'rxjs/Subject'; 
import { Observable } from 'rxjs/Observable'; 
import * as io from 'socket.io-client'; 

export class ChatService { 
    private url = 'http://localhost:4000'; 
    private socket; 

    sendMessage(message){ 
    this.socket.emit('add-message', message); 
    } 

    getMessages() { 
    let observable = new Observable(observer => { 
     this.socket = io(this.url); 

     this.socket.on('message', (data) => { 
     observer.next(data);  
     }); 

     return() => { 
     this.socket.disconnect(); 
     }; 
    })  
    return observable; 
    } 
} 

chat.template.html

<div class="col-lg-8 well" style="min-height: 200px"> 
    <ul class="col-lg-12"> 
     <li *ngFor="let message of messages"> 
      {{message.text}} 
     </li> 
    </ul> 
</div> 
<div class="col-lg-4 well"> 
    <input [(ngModel)]="message" class="form-control"> 
    <br> 
    <button class="btn btn-primary col-lg-4" (click)="sendMessage()">Send</button> 
</div> 

答えて

0

は、私は誰が同じ問題に貼付されている場合、問題を解決するために管理しました。 私は2台のサーバーを稼働させていました。 Angular 2アプリとnodemon用のlite-serverです。 ライトサーバーとブラウザの同期が原因でした。 1台のサーバーでプロジェクトを実行することで問題は解決しました。

関連する問題