0
votes

socket.io attend la réponse dans node.js

J'essaye de recevoir un fichier json avec socket.on après une émission d'événement et d'utiliser cette réponse dans un autre fichier. Ma connaissance des sockets est assez limitée. Voici le code.

fichier principal:

var socketIo = require('socket.io-client');
var socket = socketIo('http://localhost:9096');


exports.emitMsg = async function() {
    socket.emit('getSchema', () => {});
}

socket.on('resJson', (response) => {
    exports.receivedSch = response;
    return response;
});

De toute évidence, la valeur de receiveSch n'est pas définie. P >

client.js

  const socketclass = require('../public/socket/client');
  await socketclass.emitMsg();
  let val = socketclass.receivedSch;
  console.log(val);

L'événement resJson et le fichier JSON sont reçus via le 9096 port correctement depuis un autre serveur. Je ne sais tout simplement pas comment attendre de recevoir l'événement avant de let val = socketclass.receivedSch;

Le simple renvoi de réponse fonctionnerait également pour mon recherche, mais je ne sais pas comment le renvoyer depuis le socket.on


7 commentaires

La fonction emitMsg est-elle sur mesure ou est-elle générique?


emitMsg n'est pas une promesse donc -> wait socketclass.emitMsg (); ne fonctionnera pas. Enveloppez votre exports.emitMsg dans une nouvelle promesse () , ..


@Keith c'est un async fonction , qui renvoie une promesse


@George Oui, une promesse qui ne fait rien ,. IOW: une promesse inutile. Placer async sur une fonction ne transforme pas automatiquement une fonction de rappel en promesse.


@Keith Je suis d'accord que c'est une promesse qui ne fait rien, mais leur recommander d'envelopper la fonction est une promesse ne changera rien. Il n'y a pas de fonctions de rappel dans ce code, mais placer async sur une fonction fera que cette fonction retournera une promesse.


@George Oui, il y a un callback .. C'est ainsi que fonctionne socket.io ack.


@Keith ohh vous êtes à propos de socket.emit , je pensais que vous parliez du emitMsg lui-même, excusez-moi, j'ai mal compris ce que vous avez dit.


3 Réponses :


0
votes

Veuillez suivre les étapes données pour y parvenir.

1) Incluez const EventEmitter = require ('events'); dans votre fichier.

2) Créer un émetteur d'événements objet avant socket.on

myEmitter.on('got_response', function(data) {
 //console.log(data);
});

3) Recevez votre réponse en utilisant votre objet myEmitter .

const myEmitter = new EventEmitter();
socket.on('resJson', (response) => {
    exports.receivedSch = response;
    myEmitter.emit('got_response', response); //emit event (important)
});

Cela pourrait vous aider.


0 commentaires

1
votes

Votre exports.emitMsg ne fait pas ce que vous pensez qu'il devrait, le mot-clé async ici ne fait absolument rien à part renvoyer une promesse qui se résout à undefined.

Parce que votre socket.emit est une fonction de rappel, vous voudrez l'envelopper dans une nouvelle promesse .

Alors essayez ->

let val = await socketclass.emitMsg();

Pour que votre ack ait un sens, vous pouvez également utiliser le résultat comme->

exports.emitMsg = function() {
  return new Promise((resolve) => {
    socket.emit('getSchema', resolve);
  });
}

p >


2 commentaires

@George C'est difficile à dire, car le code du serveur n'est pas affiché ici. Mais si vous voulez une réponse de type ACK / NAK , utiliser «on» ici n'est pas vraiment la meilleure option. L'OP ne réalise peut-être pas que vous pouvez obtenir une réponse d'un emit si vous utilisez le rappel ack .


Moi non plus, c'est pourquoi j'ai supprimé mon commentaire, mais vous êtes trop rapide :)



0
votes

corrigé en utilisant l'application Express:

client.js strong> p> xxx pré>

et nécessitant ce fichier avant de démarrer l'application: P>

var controller = require('./client.js')(app.db.models, app);
controller.write();//method that wil use app.jsonhandler


0 commentaires