首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在React和Node中使用路由处理程序

在React和Node中使用路由处理程序
EN

Stack Overflow用户
提问于 2018-07-10 05:23:40
回答 1查看 106关注 0票数 1

当有人转到我的应用程序的/videocall响应端时,我试图显示一个组件。

代码语言:javascript
复制
<BrowserRouter>
  <Route path="/videocall" component={VideoCall} />
</BrowserRouter>

下面是如何通过单击不同组件的按钮进入该路径的方法。

代码语言:javascript
复制
<Link to='/videocall'>
  Go to Video Call
</Link> 

在此之前一切都很顺利。我可以看到我的新VideoCall组件。

但是,我也希望在我的应用程序的节点/Express端设置这个路由处理程序,这样我就可以启动Socket.io服务器。

由于React和Express呈现不同,所以express不知道如何处理/videocall

我用它就像下面这样。

代码语言:javascript
复制
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文件,如下所示:

代码语言:javascript
复制
app.get('*', (req, res) => {
  res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
});

而且效果很好。当我从URL转到/videocall时,我会被路由到VideoCall组件。

但是客户端只有在我进入/api/videocall时才会连接到套接字服务器,而不是在我进入/videocall时才会连接到套接字服务器。

如何解决这个问题,因为当客户端从前端的不同组件转到VideoCall组件时,希望客户端连接到套接字服务器,如下所示:

代码语言:javascript
复制
<Link to='/videocall'>
  Go to Video Call
</Link>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 07:49:23

所以,我终于成功了。

我就是这么做的。

我在index.js文件中编写了套接字代码,而不是在任何路由处理程序中。

代码语言:javascript
复制
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生命周期方法中编写了连接方法。所以现在我只有在走那条/videocall路线的时候才会连接。

代码语言:javascript
复制
import io from 'socket.io-client';
var socket;

class VideoCall extends Component {
  componentDidMount() {
    socket = io('http://localhost:5000');
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51257743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档