我使用API构建了一个服务器。它使用Axios进行未记录的呼叫,使用Socket.io进行记录的呼叫。 然后我有一个网站连接到它。这完美地工作。 但我也有一个内置的react-native应用程序,它有一个奇怪的行为:它打开每个发射的连接而不关闭它们以前的连接。正如你在下面看到的,我console.log websocket.engine.clientsCount在服务器上。每当我从电话应用程序发出时,它都会打开一个新的连接,找到服务器的数量不断增加。Socket.io与React-Native打开多个连接
在服务器上,用户我以下版本:
"connect-mongo": "^1.3.2",
"express": "^4.14.1",
"express-session": "^1.12.1",
"jwt-simple": "^0.5.1",
"mongodb": "^2.2.30",
"mongoose": "^4.11.5",
"passport": "^0.3.2",
"passport-jwt": "^2.2.1",
"passport-local": "^1.0.0",
"socket.io": "^1.7.3",
"socketio-jwt": "^4.5.0"
这里的API的代码。为了清晰起见,我删除了一些代码
const passport = require('passport');
const express = require('express');
const session = require('express-session');
const http = require('http');
const morgan = require('morgan');
const mongoose = require('mongoose');
const socketio = require('socket.io');
const bodyParser = require('body-parser');
const socketioJwt = require("socketio-jwt"); // da commentare
const Users = require('../models/users');
const passportService = require('./services/passport');
const requireAuth = passport.authenticate('jwt', {session: false});
const requireLogin = passport.authenticate('local', {session: false});
const config = require('./config');
const app = express();
const socketRouter = require('./services/socketRouter');
const MongoStore = require('connect-mongo')(session);
const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost/blablabla';
mongoose.connect(mongoUri);
...
const server = http.Server(app);
const websocket = socketio(server);
// add authorization for jwt-passport when first connection -> https://github.com/auth0/socketio-jwt
websocket.use(socketioJwt.authorize({
secret: config.secret,
handshake: true
}));
const sessionMiddleware = session({
store: new MongoStore({ // use MongoDb to store session (re-using previous connection)
mongooseConnection: mongoose.connection,
ttl: (1 * 60 * 60)
}),
secret: config.secretSession,
httpOnly: true,
resave: false,
saveUninitialized: false,
cookie: { maxAge: 86400000 }
});
app.use(sessionMiddleware);
...
websocket.on('connection', (socket) => {
Users.findById(socket.decoded_token.sub, function(err, user) {
if (err) { console.log('the user wasn\'t find in database', err); }
if (user) {
socket.join(user._id);
console.log('Clients connected: ', websocket.engine.clientsCount);
// ------ PROTECTED EVENTS ------ //
...
// ------------------------------ //
}
socket.on('disconnect',()=> {
socket.leave(user._id);
onsole.log('user disconnected');
});
});
});
...
我不会把网站的初始化,因为它运作良好。
在移动应用程序,我的用户以下版本:
"react-native": "^0.41.0",
"react-native-keychain": "^1.1.0",
"socket.io-client": "^1.7.3",
"socketio-jwt": "^4.5.0"
这里是反应本地应用程序的innitialisation。
import * as Keychain from 'react-native-keychain';
import { BASIC_WS_URL } from '../api';
const io = require('socket.io-client/dist/socket.io');
const socketEvents = require('./events');
exports = module.exports = (store) => {
Keychain.getGenericPassword().then((credentials) => {
if (credentials && credentials !== false) {
const { password } = credentials;
const websocket = io(BASIC_WS_URL, {
jsonp: false,
transports: ['websocket'], // you need to explicitly tell it to use websockets
query: {
token: password
}
});
websocket.connect();
websocket.on('connect', (socket) => {
console.log('Connected');
});
websocket.on('reconnect', (socket) => {
console.log('Re-connected');
});
websocket.on('disconnect', (socket) => {
console.log('Disconnected');
});
// all the events to listen
socketEvents(websocket, store);
}
});
};
我在做什么错?
根据我的理解,问题在于React-Native中的套接字是全局的。每次我发射时,它都会打开一个新的连接而不关闭前一个连接。 我正在尝试初始化套接字并使其成为全局的,以便能够在动作创建器中发出。如果我使用'context',我可以在其他组件中检索已初始化的套接字,但它不会再发出(我错过了我猜测的圆形对象的概念)。另外,授权连接的钥匙串标记是异步的,并且它不适用于生命周期组件功能。 有没有人有工作实施? – Pibo