React-native Redux socket.io 会话身份验证

React-native Redux socket.io session authentication

本文关键字:会话 身份验证 io socket Redux React-native      更新时间:2023-09-26

关于在HTTP请求将redux/react-native连接到 socket.io 的任何建议?我需要先发出 http 请求来存储身份验证会话 cookie,然后连接到 socket.io。我看到的所有示例(即 https://www.npmjs.com/package/redux-socket.io)都立即连接到 socket.io。我的想法是倾听操作并在自定义 redux 中间件中像这样连接:

import React from 'react-native'
import * as actions from './actions/';
import io from 'socket.io-client/socket.io';
export default socketMiddleware = (store) => {
    return next => action => {
    const result = next(action);
    // var socket = io();
    //
    if (action.type === 'HTTP_CONNECT_SUCCEEDED') {
      debugger;
      const socket = io('localhost:3000', {jsonp: false);
      socket.on('connect', function(){console.log('Connected!')});
    }
    //
    // socket.on('message', data => {
    //   store.dispatch(actions.addResponse(data));
    // });
    //
    // if (socket && action.type === actions.ADD_MESSAGE) {
    //   let messages = store.getState().messages;
    //   socket.emit('message', messages[messages.length -1]);
    // }
    return result;
  };
}

这适用于连接,但我必须在"HTTP_CONNECT_SUCCESS"条件中定义我的套接字,因此在该操作发生之前,我的其他套接字操作和事件是未定义的。 如何在操作上连接到 WS,并公开我的套接字事件和其他操作?

我希望暂时的

技巧是使我的套接字变量全局化,并将事件包装在有条件的中:

import React from 'react-native'
import * as actions from './actions/';
import io from 'socket.io-client/socket.io';
export default socketMiddleware = (store) => {
  return next => action => {
    const result = next(action);
    globalSocket = typeof globalSocket === 'undefined' ? false : globalSocket
    if (action.type === 'HTTP_CONNECT_SUCCEEDED') {
      globalSocket = io('http://localhost:3000', {jsonp: false});
      globalSocket.on('connect', () => {
        console.log('Connected!')
      });
    }
    if (globalSocket != false) {
      globalSocket.on('friends', data => {
        store.dispatch(actions.updateFriends(data));
      })
      if (action.type === 'CREATE_QUESTION') {
        globalSocket.emit('createQuestion', action.question);
      }
    }
    return result;
  };
}