2017-03-06 4 views
0

server.jssocket.io Daten vom Server zum Client

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

app.use(express.static(__dirname + '/public')); 

io.on('connection', function(client) { 
    console.log('Client connected...'); 

client.on('join', function(data) { 
    console.log(data); 
    io.emit('messages', 'Hello'); 

}); 

}); 

index.html

<script> 
    var socket = io.connect('http://localhost:7777'); 
    socket.on('connect', function(data) { 
     socket.emit('join', 'Hello World from client'); 

    }); 
    socket.on('messages', function(data) { 
     alert(data); 
    }); 
</script> 

Ich habe versucht, sehr einfach von Socket.io zu implementieren.

Daten senden von Client zu Server ist jedoch verfügbar, aber von Server zu Client funktioniert nicht.

Im Befehl running server.js wird 'Hello World from client' gedruckt. Das Benachrichtigungsfenster funktioniert jedoch nicht im Webbrowser (Ich habe auch versucht, console.log zu erstellen).

Wie löst man das?

Editted

I server.js Codes in der app.get ('/', function (req, res)) gesetzt haben {...} Dann funktioniert es nicht. Warum funktioniert es nicht in app.get?

+0

socket.io-Code gehört nicht zu einer bestimmten Route. Wenn Sie erklären können, was Sie mit dem 'app.get()' Teil Ihrer Frage versuchen und Sie uns zeigen können, welchen Code Sie in 'app.get()' einfügen, könnten wir Ihnen vielleicht einen Vorschlag machen. Aber gerade jetzt ist dieser Teil Ihrer Frage sehr vage und unklar. – jfriend00

+0

Vielen Dank für Ihre Antwort. Ich versuche, Daten aus elasticsearch mit node.js abzurufen und an den Anfang zu senden. Ich fand, dass mehrere Lösungen, um damit umzugehen, ejs oder Mops verwenden. Ich habe versucht, Vorlage mit Mops und Vue.js zu verwenden, aber was ich tun möchte (mit Google Map API kombinieren) funktioniert nicht gut. Deshalb wähle ich socket.io. Außerdem dachte ich, es wäre besser, Daten von Server zu Front zu senden, wenn ich die spezifische URL wie app.get eingeben ('/ test', ...). – coffeedjason

Antwort

0

die Sie interessieren, ich hoffe, es funktioniert:

io.on('connection', function(client) { 
console.log('Client connected...'); 

client.on('join', function(data) { 
     console.log(data); 
     io.emit('join', data); //this code sending data from server to client 
    }); 
}); 
+0

Was für eine Schande! Danke Kumpel.Ich habe diese Codes mit anderen gemischt, also habe ich diesen Code verpasst. – coffeedjason

+0

gute Arbeit Alter :) – sidzaky

1

Wenn Sie nur ein paar Daten mit einem Ajax-Aufruf zu holen versucht, wie /test, dann gibt es keine Notwendigkeit ist socket.io zu verwenden. Das ist nur eine klassische Anfrage/Antwort.

app.get('/test', function(req, res) { 
    // collect your data and then send it as a response 
    res.json(data); 
}); 

Wenn Sie versuchen, nur Daten in eine Webseite zu integrieren, die angefordert wird, dann können Sie res.render() mit der Template-Engine Ihrer Wahl verwenden (EJS, Lenker, Mops, etc ...). Das würde aussehen typischerweise wie folgt aus:

app.get('/test', function(req, res) { 
    // collect your data and then pass it to res.render() to render your 
    // your template using that data 
    res.render('someTemplateName', data); 
}); 

Die Hauptsache ist, die nützlich Socket.io ist für die Daten vom Server zum Client ohne eine Client-Anforderung „Schieben“. Wenn also etwas auf dem Server passiert ist, das der Client nicht kannte und der Server dem Client das mitteilen wollte, dann würde socket.io dafür verwendet werden. Das klassische Beispiel ist eine Chat-App. Person A sendet eine Chat-Nachricht an den Server, der an Person B adressiert ist. Der Server empfängt diese Nachricht und muss sie dann an Person B "pushen". Das wäre perfekt für eine bereits verbundene socket.io-Verbindung, weil der Server es einfach kann push die Daten direkt zum Person B Client, was der Server nicht mit Anfrage/Antwort tun kann (da es keine Anfrage von Person B gibt).


Wenn Sie noch denken, Sie socket.io benötigen, dann bitte genau beschreiben, was Sie versuchen, mit ihm (Schritt für Schritt, was Sie versuchen an den Client zu senden) zu tun.

+0

Vielen Dank für Ihre Antwort. Ich habe Lösungen mit Template-Engines wie deins gefunden. Der Grund, warum ich socket.io verwende, ist jedoch, dass ich verwirrt war, wie man Vorlagen-Engine und Google Map API zusammenführt. Wenn zum Beispiel Daten in res.render ('someTemplateName, data); 'ein Bündel von Koordinaten sind, möchte ich eine Heatmap erstellen, indem ich diese Koordinaten verwende. Ist es in diesem Fall möglich, Template Engine und Google Map API zusammenzuführen? – coffeedjason

+0

@coffeedjason - Sie sammeln Daten von Google Maps API und legen sie in ein gewünschtes Format für Ihre Vorlage, dann übergeben Sie es an 'res.render()'. Ich sehe immer noch nicht, wie socket.io mit einer Lösung hier etwas zu tun hat, es sei denn, Sie brauchen irgendwie Live-Push von Server zu Client, wenn keine Client-Anfrage läuft. – jfriend00

+0

Danke jfriend00. Meine Erklärung ist nicht gut, denke ich. Ich möchte Daten (Koordinaten) aus der Datenbank abrufen und diese Koordinaten mit google map api in der Front ausdrücken. Dafür möchte ich das Array von json (Koordinaten) nach vorne übergeben und dieses Array in der Front entpacken, um jede Koordinate darzustellen. Wenn ich 'res.render()' verwende, muss ich die HTML-Datei mit der Template-Engine serverseitig nach meinem Verständnis rendern. In diesem Stadium ist es möglich, die HTML-Datei mit solchen API wie Google Maps zu rendern? – coffeedjason

Verwandte Themen