Javascript React native Redux socket.io会话身份验证
关于在http请求后将redux/react native连接到socket.io有什么建议吗?我需要首先发出http请求来存储一个身份验证会话cookie,然后连接到socket.io。我看到的所有示例(即)都立即连接到socket.io。我的想法是在自定义redux中间件中倾听操作并像这样连接:Javascript React native Redux socket.io会话身份验证,javascript,socket.io,react-native,session-cookies,redux,Javascript,Socket.io,React Native,Session Cookies,Redux,关于在http请求后将redux/react native连接到socket.io有什么建议吗?我需要首先发出http请求来存储一个身份验证会话cookie,然后连接到socket.io。我看到的所有示例(即)都立即连接到socket.io。我的想法是在自定义redux中间件中倾听操作并像这样连接: import React from 'react-native' import * as actions from './actions/'; import io from 'socket.io-c
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;
};
}
边际改进,但您可以使用
var
而不是全局,即var socket=null
而不是globalSocket=typeof…
。然后在if(action.type=='HTTP\u CONNECT\u successed')
中设置socket
,并将if(globalSocket!=false)
更改为if(socket)
。