Как использовать socketio для отправки данных на expressjs из express? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть простое приложение для аутентификации в Instagram. После того, как я аутентифицируюсь в Instagram и получаю профиль пользователя, я хотел бы отправить имя пользователя со стороны сервера на сторону клиента activjs. Я пытался использовать сокет IO, но не могу заставить его работать.

Клиентская сторона

componentDidMount() {
        const { socket, provider } = this.props
        console.log('component did mount')

        socket.on(provider, user => { //provider is a string e.g 'instagram'
        //receives data and update state.
            this.setState({user})
        })
    }

startAuth() { //onclick function that opens up new window for auth
        const {provider} = this.props

        const width = 600, height = 600
        const left = (window.innerWidth / 2) - (width / 2)
        const top = (window.innerHeight / 2) - (height / 2)
        const url = `https://localhost:5000/${provider}`

        return window.open(url, '',       
          `toolbar=no, location=no, directories=no, status=no, menubar=no, 
          scrollbars=no, resizable=no, copyhistory=no, width=${width}, 
          height=${height}, top=${top}, left=${left}`
        )        
    }

Серверная сторона

//After successful authentication redirect here with username and provider as
//query string. Here I want to emit to my component and update component's state
app.get('/success', (req, res) => {
  var provider = req.query.provider
  var username = req.query.username
  io.emit(provider, username); //this doesn't work
  res.send('Auth to ' + provider + ' successful by ' + username)
})

Что я должен сделать, чтобы отправленное событие на стороне сервера было поймано внутренним компонентом componentDidMount ()? Я не получил никаких сообщений об ошибках вообще. Я даже не уверен, было ли запущено событие в / success или нет.

Сокетное соединение работает нормально, я сделал следующий код ниже, и оно отлично работает.

io.on('connection', (client) => {
  client.on('subscribeToTimer', (interval) => {
    console.log('client is subscribing to timer with interval', interval);
    setInterval(() => {
      client.emit('timer', new Date());
    }, interval);
  })
})

1 Ответ

0 голосов
/ 11 июля 2019

Я столкнулся с подобной проблемой в проекте, над которым работал, и способ, которым я решил проблему, был

  • Создать файл io.js
// singleton instance of socket.io that is stored here after the
// constructor function is called
let ioInstance;

module.exports = function(server) {
  const io = require("socket.io")(server);
  io.on("connection", socket => {
    console.log("made socket connection", socket.id);

    // Handle socket event
    socket.on("eventTrigger", function(data) {
      // console.log(data);
      io.sockets.emit("chat", data);
    });
  });

  // save in higher scope so it can be obtained later
  ioInstance = io;
  return io;
};

// this getIO method is designed for subsequent
// sharing of the io instance with other modules once the module has been initialized
// other modules can do: let io = require("./io.js").getIO();
module.exports.getIO = () => {
  if (!ioInstance) {
    throw new Error(
      "Must call module constructor function before you can get the IO instance"
    );
  }
  return ioInstance;
};

  • В файле bin/www добавьте следующий код
var app = require("../app");
var debug = require("debug")("express-sequelize");
var http = require("http");
var models = require("../models");

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || "3000");
app.set("port", port);
/**
 * Create HTTP server.
 */
var server = http.createServer(app);

//initialize io
require("../io")(server); 

 server.listen(port, function() {
    debug("Express server listening on port " + server.address().port);
  });
  server.on("error", onError);
server.on("listening", onListening);
  • , теперь в файле маршрута для вызова API, если я хочу отправить данные сокета
@file app.js

app.get('/success', (req, res) => {
   const io = require("./io").getIO();
   ....
   io.sockets.emit("eventTrigger",data);
  res.send('Auth to ' + provider + ' successful by ' + username)
})

Надеюсь, что этот подход поможет исправить проблему, с которой вы столкнулись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...