2017-01-13 3 views
0

Ich habe seit zwei Tagen gesucht, auf der Suche nach einer Lösung, die für mich arbeiten könnte. Leider habe ich nur Beispiele und Anleitungen zum Einrichten eines Websocket-Servers (der Nachrichten an Clients sendet) und eines Websocket-Clients (der sich im Browser befindet) eingerichtet. Nichts davon funktioniert wirklich für mich, und ich bin mir nicht sicher, wie ich hier erreichen soll, was ich will.NodeJS Websocket verwenden Variable in HTML (mit Express?)

Grundsätzlich habe ich folgendes websocket:

require('dotenv').config() 

const WebSocket = require('ws'); 

var connection = new WebSocket('ws://XXX'); 

connection.onopen = function() { 
    connection.send(JSON.stringify({"authenticate":process.env.API})); 
    connection.send(JSON.stringify({"XXX":"YYY"})); 
    connection.send(JSON.stringify({ 
    "db" : "unique_id", 
    "query" : { 
     "table" : "users" 
    } 
})); 
}; 
connection.onerror = function (error) { 
    console.log('WebSocket Error ' + error); 
}; 

connection.onmessage = function (e) { 
    console.log('Server: ' + e.data); 
    var myResponse = JSON.parse(e.data); 
    var qList = myResponse.results; 
}; 

Was ich tun möchte, ist meinen NodeJS-Skript ausgeführt wird, zum Beispiel einen Express-Skript mit einer HTML-Seite, die die Antwort von onmessage enthält auch. Warum ich dies verkompliziere, anstatt nur die Websocket-Client-Seite zu verwenden, ist, dass ich meinen Autorisierungscode nicht öffentlich senden kann.

Ich hoffe, ich war klar genug, lassen Sie es mich wissen, wenn Sie sich meiner Frage nicht sicher sind!

PS. Wenn Sie denken, ich wäre besser dran mit einem anderen Websocket-Skript wie Socket.io - ich habe sie angeschaut und bin nicht viel klüger geworden.

+0

Ich habe eine Menge Arbeit mit WS-Server-Client-Implementierung (hat diese automatische Gebots Programm) getan, aber ich bin mir nicht sicher, wo das Programm fehlschlägt. Was stimmt nicht mit dem, was du getan hast? –

+0

Gibt es einen Grund, warum Ihr Datenbankserver nur über Websockets kommuniziert? – gregnr

+0

@gregnr Er benutzt seinen Server als Client, um sich über Web-Sockets mit einem Dritten zu verbinden. –

Antwort

0

Sie haben viele Optionen. Wahrscheinlich ist es am einfachsten, die Verbindung zu exportieren. Am unteren Ende der Datei, z.B. module.exports = connection

Dann in der Express-Anwendung, importieren Sie die Verbindung, z. const connection = require('./path/connection');

Dann machen Sie eine Funktion, die sich in einem bestimmten Intervall selbst aufruft und die entsprechende Nachricht sendet.

Dann können Sie in der Express-App etwas wie connection.on verwenden ('Nachricht', (Daten, Flags) => // Dinge tun);

Ihre andere Option besteht darin, ein Geschäftsobjekt zu erstellen. Z.B.

// ./store.js 

class store { 
    constructor() { 
    this.wsMaterial = {}; 
    } 

add(wsInfo) { 
    this.wsMaterial[key] = wsInfo 

} 

get store() { 
    return this.wsMaterial 
} 
} 

module.exports = new store() 

Dann importieren Sie das Geschäft und aktualisiert es, z.

// ./websocket file 

const store = require('./store'); 

... 

connection.onmessage = function (e) { 
    console.log('Server: ' + e.data); 
    var myResponse = JSON.parse(e.data); 
    var qList = myResponse.results; 
    store.add(qList) 
}; 

dann von Express ...

// ./express.js 

const store = require('./store'); 

store.get // all of your stuff; 
+0

@ d-walsh, Vielen Dank für Ihre detaillierte Hilfe! Ich denke, ich bin jetzt fast da, das einzige, was mir schwer fällt zu verstehen, ist die Verwendung von 'store.get' in meinem Express-Skript. Ich weiß, wie man andere Variablen an meine .ejs-Datei in render übergeben kann, aber die store.get var ist leer. Hier ist, wo ich jetzt bin: 'app.get ("/", Funktion (req, res) { \t const store = require ('./ store'); \t var list = store.get; \t var test = "test"; \t \t res.render ('index', \t {list: list, \t Test: Test \t}); }); ' – Erik

+0

Crap I 'Es tut mir leid. Ich ging zur Tür und ging viel zu schnell. In meinem Beispiel möchten Sie store.store nicht store.get. (Und offensichtlich wollen Sie die Methode wahrscheinlich umbenennen. Store.store ist ein bisschen seltsam :)) –

+0

Kein Problem! Leider habe ich diesen Fehler nicht selbst bemerkt ... Ich denke, ich bin jetzt fertig, zumindest bekomme ich [object Object] angezeigt, aber ich denke, es gibt einen Fehler mit der Store-Datei. Wenn ich versuche, den websocket-js auszuführen, heißt es, dass 'key' nicht in der Datei store.js definiert ist:' this.wsMaterial [key] = wsInfo ^ ReferenceError: Schlüssel ist nicht definiert' Sorry für alle Fragen, eine Schande, aber auf die Ziellinie zu verzichten! – Erik