Wie kann ich die export-Steckdose.io in anderen Modulen in nodejs?
Habe ich socket.io
arbeiten in app.js
aber wenn ich versuche zu nennen, die es von anderen Modulen seinem schaffen nicht io.connection
nicht sicher ?
app.js
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var ditconsumer = require('./app/consumers/ditconsumer');
ditconsumer.start(io);
server.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
consumer.js
module.exports = {
start: function (io) {
consumer.on('message', function (message) {
logger.log('info', message.value);
io.on('connection', function (socket) {
socket.on('message', function(message) {
socket.emit('ditConsumer',message.value);
console.log('from console',message.value);
});
});
});
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da app.js ist in der Regel Art des main-Initialisierung Modul in Ihrer app, wird es typischerweise sowohl initialisieren der web-server und socket.io und laden andere Dinge, die benötigt werden, von der app.
Als so eine typische Art und Weise zu teilen
io
mit anderen Modulen ist, indem man Sie zu den anderen Modulen die in diesem Modul Konstruktor-Funktion. Das würde funktionieren wie dieser:Dann, in consumer.js:
Oder, wenn Sie wollen, zu einem
.start()
Methode zum initialisieren Dinge, die Sie tun können, die gleiche Sache mit, dass die (geringfügige Unterschiede):Und die start-Methode in consumer.js
Dies ist, was ist bekannt als die "push" - Modul von Ressourcen-sharing. Das Modul laden Sie schiebt einige gemeinsame info, um Sie durch übergeben Sie im Konstruktor.
Gibt es auch "pull" - Modelle, bei denen das Modul selbst eine Methode aufruft, die in einigen anderen Modul abrufen der freigegebenen Informationen (in diesem Fall die
io
Objekt).Oft, entweder Modell kann gemacht werden, um zu arbeiten, aber in der Regel eine oder die andere wird mehr natürliches Gefühl gegeben, wie Module geladen werden und wer die gewünschten Informationen und wie Sie beabsichtigen, für Module, die wiederverwendet werden in anderen Umständen.
io
Objekt brauche ich zum erstellenio.on
- Verbindung in jedem Modul, wie Sie es fürconsumer.js
io.on('connection, ...)
man das mit sockets. Es gibt sicherlich auch andere Möglichkeiten, Architekt, Dinge, wo Sie haben eine zentraleio.on('connection, ...)
und andere Module beitragen kann, die message-Listener, aber das ist eine größere änderung im code, und wir müssten, um zu verstehen, mehr über was du tust, um zu wissen, das beste, was zu empfehlen. Aber, ist es auch keine große Sache, um mehrereio.on('connection, ...)
Zuhörer.io
ist eineventEmitter
und ist gebaut, um viele der Zuhörer.start
exportierte Methode, dann geben Sie einfachio
zu denstart
Methode und Holen Sie es von dort. Der Punkt ist, dass Sie dieapp
- Modul übergeben, dasio
Objektconsumer
Modul als Teil der Start/Initialisierung derconsumer
Modul. Aber, was du zeigst sieht aus wie Sie können, ersetzen Sie einfach, was Sie mit dem, was ich vorgeschlagen, und verwenden Sie eine Konstruktor-Funktion anstelle einesstart()
Methode - obwohl in beiden Fällen kann die Arbeit nur gut.require('./consumer.js)(io);
Bearbeiten können Sie Ihre Antwort mir helfen, besser zu verstehen ?.start()
Methode. Das Konzept ist identisch, ob es die.start()
Methode oder ein Modul Konstruktor-Funktion. Die Idee ist, dass Sie eine exportierte Funktion in den consumer-Modul übergeben und dieio
Instanz-variable, so kann es dann verwenden.logger.log('info', message.value)
Nachricht, aber seine nicht innerhalbio.connection
Funktion und ich sehe keine Fehler. siehe meine Frageio
arbeiten seiner Absendung string , client, jetzt habe ich wirklich brauchen, um zu sehen, wie kann ich det Nachricht von Verbraucher-und übergeben es anio
Dank nochmal für die Hilfe!Wenn Sie möchten, um zu vermeiden, die Globale Reichweite, machen Sie Ihre
io
gibt es in einer separaten Datei wie folgt:Dann in
app.js
:und in
consumer.js
:var socket = require('../index').io()
in consumer.js aber seine werfen FehlerTypeError: require(...).io is not a function
index.js
?index.js
haben Sie den codeexports.io = function () { return io; };
?consumer.js
?io
index
. Das ist ein wichtiger name für die Module, und es könnte sein messing mit der Datei, dierequire(...)
aufgelöst wird. Ich empfahlio.js
aber Sie ging gegen den Vorschlag.var socket = require('../io').io(); ^ TypeError: require(...).io is not a function
console.log(require('../io'))
. Das sollte Ihnen sagen, welche Datei es ist, den Import durch die überprüfung der exportierten Werte...Können Sie eine singleton-Instanz in nur 4 Zeilen.
In websocket.js schreiben Sie Ihre server-Konfigurations-code.
Dann in Ihre consumer.js nur benötigen die Datei
Fand ich einfach Lösung
Die Lösung ist ganz einfach. Verwenden Sie Globale Variablen in app.js und der Zugriff aus anderen Dateien.
global.io = require('socket.io').listen(server);
Ich habe eine Datei
socket.service.ts
mit einer Klasse SocketService und inapp.ts
rief ich den Konstruktor mit dem http. Dies funktioniert auch mit reinem javascript, ändern Sie einfach die ein-und Ausfuhren ...in
app.ts
Anruf wie:Bitte beachten Sie, dass jedes mal, wenn Sie rufen den Konstruktor eine neue Instanz erstellt werden. Um dies zu vermeiden, verwenden Sie das singleton-Muster 🙂