当有人在应用程序的React端进入/videocall
时,我试图显示一个组件。
<BrowserRouter>
<Route path="/videocall" component={VideoCall} />
</BrowserRouter>
以及通过其他组件上的按钮单击,某人可以转到该路线的方法。
<Link to='/videocall'>
Go to Video Call
</Link>
到这里为止一切正常。我可以看到我的新
VideoCall
组件。但我也希望在我的应用程序的Node / Express端使用此路由处理程序,以便可以启动Socket.io服务器。
由于React和Express渲染不同,所以express不知道如何处理
/videocall
。我正在如下使用它。
const socketIO = require('socket.io');
module.exports = (app, server) => {
app.get('/api/videocall', (req, res) => {
const io = socketIO(server);
io.on('connection', (socket) => {
console.log('User connected');
socket.on('message', (msg) => {
console.log(msg);
});
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
});
}
我正在使用通配符路由匹配,该匹配将呈现默认的
index.html
文件,如下所示:app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
});
而且工作正常。当我从URL转到
/videocall
时,将路由到我的VideoCall组件。但是,仅当我进入
/api/videocall
时,客户端才连接到套接字服务器,而当我进入/videocall
时,客户端才连接到套接字服务器。我该如何解决该问题,因为我希望客户端从前端的其他组件转到
VideoCall
组件时,将其连接到套接字服务器,如下所示:<Link to='/videocall'>
Go to Video Call
</Link>
最佳答案
因此,我终于设法使它起作用。
这是我的方法。
我将套接字代码写在了index.js
文件中,而不是在任何路由处理程序中。
const socket = require('socket.io');
const PORT = process.env.PORT || 5000;
const server = app.listen(PORT);
const io = socket(server);
io.on('connection', (socket) => {
console.log('User connected');
socket.on('message', (msg) => {
console.log(msg);
});
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
在我的VideoCall组件中,我在
componentDidMount
生命周期方法中编写了connect方法。所以现在我只有在走/videocall
路线时才连接。import io from 'socket.io-client';
var socket;
class VideoCall extends Component {
componentDidMount() {
socket = io('http://localhost:5000');
}
}