2017-02-02 23 views
1

Das Problem ist, dass, wenn ich versuche, "this.io.emit" -Ereignis zu feuern, ein TypeError auftritt. Es gibt nur während ich schreibe diese Anweisung "this.io.emit" in "socket.on" Block sonst, wenn ich es außerhalb dieses Blocks schreibe es erzeugt keinen Fehler.TypeError: Kann die Eigenschaft 'emit' von undefined nicht lesen

Dies ist die wichtigste server.js Datei mit den anderen Bibliotheken zu nennen:

const express = require('express'), 
http = require('http'), 
socketio = require('socket.io'); 

class App{ 

constructor() 
{ 
    this.port = process.env.PORT || 81; 
    this.host = `localhost`;   
    this.app = express(); 
    this.http = http.Server(this.app); 
    this.socket = socketio(this.http); 
} 
appConfig(){ 
    new config(this.app); 
} 
appRoutes(){ 
    new routes(this.app,this.socket).routesDefault(); 
} 
appDefault(){ 
    this.appConfig(); 
    this.appRoutes(); 
    this.http.listen(this.port,this.host,()=> { 
     console.log(`Listening`); 
    }); 
}} 

mein Server-Side-Code ist:

'use strict'; 
class Routes { 

constructor(app,socket) { 
    this.app = app; 
    this.io = socket; 
    this.users=[]; 
} 

routesTemplate() 
{ 
    this.app.get('/',function(req,res){ 
     res.render('index'); 
    }); 
} 

socketEvents() 
{ 
    this.io.on('connection',(socket) => { 
     socket.on('send message',function(data) 
     { 
      this.io.emit('new message',data);//here the error lies. 
     }); 
    }); 
} 
routesDefault() 
{ 
    this.routesTemplate(); 
    this.socketEvents(); 
}} 
module.exports = Routes; 

Ich habe versucht, auch Zugriff auf „this.users.The Länge "innerhalb socket.on der Anweisung und es erzeugt den gleichen TypeError: kann die Länge der Eigenschaft nicht lesen. Ich habe keine Ahnung, warum es passiert. Bitte helfen Sie mir, dieses Problem zu lösen.

Client Side:

 <script> 
     $(function($){ 
      var socket = io.connect(); 
      var $messageForm = $('#send-message'); 
      var $messageBox = $('#message'); 
      var $chat = $('#chat'); 

      $messageForm.submit(function(e){ 
       e.preventDefault(); 
       socket.emit('send message',$messageBox.val()); 
       $messageBox.val(""); 
      }); 
      socket.on('new message',function(data){ 
       $chat.append(data+ "<br/>"); 
      }); 
     }); 
    </script> 

Antwort

3

Der Kontext this ist ein Problem in Ihrem Code. Um den aktuellen Kontext zu übergeben, verwenden Sie bind oder die Arrow Funktion. In JavaScript wird der Wert this durch definiert, wie Sie die Funktion aufgerufen haben, die in Ihrem Fall socket Objekt ist.

socketEvents() 
{ 
    this.io.on('connection',(socket) => { 
     socket.on('send message',function(data) 
     { 
      this.io.emit('new message',data);//here the error lies. 
     }bind(this)); 
    }); 
} 

S.S .: Bearbeitet, jetzt funktioniert dieser Code gut. Ich möchte den unten beschriebenen Beitrag dazu vorschlagen. Diese

What are the differences (if any) between ES6 arrow functions and functions bound with Function.prototype.bind?

+0

Aber ich habe eine andere Anwendung genau similiar, der Unterschied ist es ich AngularJS verwende, die keinen Fehler gibt, wenn die errorneous Syntax „this.io.emit“ verwenden. Das sprengt meine Meinung. Gibt es einen Unterschied in der Behandlung von "this" in beiden (javascript und angularJS)? – sagar

+0

Können Sie diesen Code anzeigen? Es hängt davon ab, wie der Code geschrieben ist, aber das "Dies" würde genauso funktionieren, wie ich weiß. – Agalo

+0

Ich erfuhr, dass das eigentliche Problem nur die Verwendung von Pfeilfunktion und Funktionen war, ohne diese zu binden. – sagar

0

ist, weil der Kontext dies unterscheidet sich für die innere Funktion.

Versuchen:

socketEvents() 
{ 
    this.io.on('connection',(socket) => { 
     socket.on('send message',function(data) 
     { 
      socket.emit('new message',data);//here the error lies. 
     }); 
    }); 
} 
+0

Sie haben Recht, aber Ihre Antwort macht keinen Sinn, da sie keine Lösung für die Verwendung von "this" innerhalb von socket.on bietet. Es bietet nur einen alternativen Weg, der in meinem Fall nicht nützlich ist. Da muss ich "dieses" Schlüsselwort verwenden (obligatorisch). – sagar

Verwandte Themen