Montag, Mai 25, 2020

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);
                });
            });
        });
}
}
InformationsquelleAutor hussain | 2016-07-21

5 Kommentare

  1. 32

    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:

    var server = require('http').createServer(app);
    var io = require('socket.io')(server);
    
    //load consumer.js and pass it the socket.io object
    require('./consumer.js)(io);
    
    //other app.js code follows

    Dann, in consumer.js:

    //define constructor function that gets `io` send to it
    module.exports = function(io) {
        io.on('connection', function(socket) {
            socket.on('message', function(message) {
                logger.log('info',message.value);
                socket.emit('ditConsumer',message.value);
                console.log('from console',message.value);
            });
        });
    };

    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):

    //app.js
    var server = require('http').createServer(app);
    var io = require('socket.io')(server);
    
    //load consumer.js and pass it the socket.io object
    var consumer = require('./consumer.js);
    consumer.start(io);
    
    //other app.js code follows

    Und die start-Methode in consumer.js

    //consumer.js
    //define start method that gets `io` send to it
    module.exports = {
        start: function(io) {
            io.on('connection', function(socket) {
                socket.on('message', function(message) {
                    logger.log('info',message.value);
                    socket.emit('ditConsumer',message.value);
                    console.log('from console',message.value);
                });
            });
        };
    }

    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.

    • also wenn ich io Objekt brauche ich zum erstellen io.on – Verbindung in jedem Modul, wie Sie es für consumer.js
    • Wenn Sie versuchen, um eingehende Nachrichten von mit sockets, dann müssen Sie io.on('connection, ...) man das mit sockets. Es gibt sicherlich auch andere Möglichkeiten, Architekt, Dinge, wo Sie haben eine zentrale io.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 mehrere io.on('connection, ...) Zuhörer. io ist ein eventEmitter und ist gebaut, um viele der Zuhörer.
    • eigentlich habe ich aktualisiert meine Frage code für Verbraucher , ich bin bereits exportieren Verbraucher in app.js ist es möglich , dass Modul hinzufügen.export-Funktion, Insider-Consumer-Objekt ?
    • Ja.. ich vergaß über diesen Ansatz. Eigentlich mag ich diesen Vorschlag besser als meiner.
    • Die änderungen für die Verbraucher sind vollkommen kompatibel mit diesem Allgemeinen Schema. Wenn Sie möchten, um Ihr start exportierte Methode, dann geben Sie einfach io zu den start Methode und Holen Sie es von dort. Der Punkt ist, dass Sie die app – Modul übergeben, das io Objekt consumer Modul als Teil der Start/Initialisierung der consumer 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 eines start() Methode – obwohl in beiden Fällen kann die Arbeit nur gut.
    • wenig verwirren, hier brauche ich noch require('./consumer.js)(io); Bearbeiten können Sie Ihre Antwort mir helfen, besser zu verstehen ?
    • Ich fügte hinzu, ein anderes Beispiel zu meiner Antwort mit der .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 die io Instanz-variable, so kann es dann verwenden.
    • Ich habe versucht, genau so, wie Sie sind, es zu tun , der Druck logger.log('info', message.value) Nachricht, aber seine nicht innerhalb io.connection Funktion und ich sehe keine Fehler. siehe meine Frage
    • Dank bekam ich io arbeiten seiner Absendung string , client, jetzt habe ich wirklich brauchen, um zu sehen, wie kann ich det Nachricht von Verbraucher-und übergeben es an io Dank nochmal für die Hilfe!
    • wie kann ich diese Lösung auf mein anderes Modul, wenn ich bereits Modul exportiert werden, die andere Funktionen?
    • Ich kann das nicht beantworten ohne zu sehen, Ihren code (die gehen würden, in Ihre eigenen Fragen). Aber, was auch immer Objekt, das Sie exportieren möchten, fügen Sie einfach weitere Methoden zu es.

  2. 21

    Wenn Sie möchten, um zu vermeiden, die Globale Reichweite, machen Sie Ihre io gibt es in einer separaten Datei wie folgt:

    var sio = require('socket.io');
    var io = null;
    
    exports.io = function () {
      return io;
    };
    
    exports.initialize = function(server) {
      return io = sio(server);
    };

    Dann in app.js:

    var server = require('http').createServer(app);
    var io = require('./io').initialize(server);
    require('./app/consumers/ditconsumer'); //loading module will cause desired side-effect
    server.listen(...);

    und in consumer.js:

    require('../io').io().on('connection', function(socket) {
      logger.log('info', message.value);
      socket.on('message', function(message) {
        socket.emit('ditConsumer',message.value);
        console.log('from console',message.value);
      });
    });
    • ich fügte var socket = require('../index').io() in consumer.js aber seine werfen Fehler TypeError: require(...).io is not a function
    • Ist die neue Datei, die Sie Hinzugefügt, genannt index.js?
    • ja, es ist index.js
    • Tut index.js haben Sie den code exports.io = function () { return io; };?
    • ja, es ist Teil index.js
    • Sind Sie sicher, die Datei befindet sich in der richtigen Position relativ zu consumer.js?
    • Ja das meine ich index.js Modul aufgerufen wird, ist aber nicht die Methode io
    • Versuchen Sie es etwas neben index. Das ist ein wichtiger name für die Module, und es könnte sein messing mit der Datei, die require(...) aufgelöst wird. Ich empfahl io.js aber Sie ging gegen den Vorschlag.
    • verändert den Namen der Datei, aber noch 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…
    • Dieser Kerl f**ks. #piedPiperReference. Ausgezeichnete Arbeit mit diesem kleinen Modul Kumpel, hat mir geholfen, noch ein paar mit einer übung, die ich mache, mit diesem.
    • danke.. diese Antwort hat mir geholfen und erspart mir eine Menge Zeit
    • Dies ist eine gute Antwort.
    • Erstaunliche und klare Antwort, hat mir geholfen, zu verstehen und umzusetzen, es selbst.

  3. 2

    Können Sie eine singleton-Instanz in nur 4 Zeilen.

    In websocket.js schreiben Sie Ihre server-Konfigurations-code.

    const socketIO = require('socket.io');
    const server = require('http').createServer();
    server.listen(8000);
    
    module.exports = socketIO(server);

    Dann in Ihre consumer.js nur benötigen die Datei

    const socket = require('./websocket');
    
    /* API logic here */
    
    socket.emit('userRegistered', `${user.name} has registered.`);
  4. 1

    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);

  5. 0

    Ich habe eine Datei socket.service.ts mit einer Klasse SocketService und in app.tsrief ich den Konstruktor mit dem http. Dies funktioniert auch mit reinem javascript, ändern Sie einfach die ein-und Ausfuhren …

    import * as socketIo from 'socket.io';
    
    export class SocketService {
    
      io: any;
    
      constructor(http) {
        this.io = socketIo(http)
        this.io.set('origins', '*:*');
        this.io.on('connection', function (socket) {
          console.log('an user connected');
          socket.on('disconnect', function () {
            console.log('user disconnected');
          });
        });
    
        http.listen(3001, function () {
          console.log('socket listening on *:3001');
        });
    
      }
    
    }

    in app.ts Anruf wie:

    import * as express from 'express';
    
    import { SocketService } from './services/socket.service';
    
    const app = express(); 
    var http = require('http').Server(app);
    
    //...
    
    new SocketService(http);
    
    //...
    
    module.exports = app;

    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 🙂

Kostenlose Online-Tests