APIを使ってサーバーを構築しました。これは、記録されていない呼び出しにはAxiosを使用し、記録された呼び出しにはSocket.ioを使用します。 それから私はそれに接続されたウェブサイトを持っています。それは完璧に機能します。 しかし私は、反応ネイティブでビルドされたアプリケーションには奇妙な動作があります。以前の接続を閉じることなく、すべての出力に対して接続を開きます。以下に示すように、私はconsole.logにサーバー上のwebsocket.engine.clientsCountを記録します。私が電話アプリケーションから発信するたびに、新しい接続が開き、その数が増えているサーバーが見つかります。Socket.ioがReact-Nativeで複数の接続を開く
サーバーで、Iユーザー以下のバージョン:ここで
"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');
});
});
});
...
私はウェブサイトが正常に機能するため、ウェブサイトの初期化を行いません。モバイルアプリケーションで
、Iユーザー以下のバージョン:
"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のソケットはグローバルであるという問題があります。私が放射するたびに、それは前のものを閉じることなく新しい接続を開きます。 私はソケットを初期化しようとしており、アクションクリエータでグローバルに送信できるようにしようとしています。私が 'コンテキスト'を使用すると、他のコンポーネントの初期化されたソケットを取得することができますが、それ以上は出ません(私が推測する循環オブジェクトのコンセプトがありません)。さらに、接続を認可するためのキーチェーントークンは非同期であり、ライフサイクルコンポーネントの機能には反映されません。 誰かに実用的な実装をされていますか? – Pibo