我已经研究了近2天了,似乎无法找到答案。我正在尝试构建一个应用程序,我使用套接字通知我的前端服务器上的某些内容已发生变化。注意 - 我没有在前端使用任何操作(因此这使得这个问题与例如在此线程上找到的内容不同,例如:socket.io emits multiple times)
不幸的是,服务器端的socket.io多次触发同一事件。从我读过的所有内容中我了解到这是因为连接保持打开状态,每次服务器重新启动它都会触发连接。我应该有办法防止它发出重复事件,但我似乎无法弄明白。
这是我的服务器端代码:
// main file
const express = require('express');
const app = express();
const routes = require('./routes/index');
const server = app.listen(process.env.PORT || 3001, () => {
console.log('listening on port 3001');
});
const io = require('socket.io')(server);
app.use('/sockets', socketFile(io))
module.exports = app;
// socketFile(同一目录)
module.exports = function(io){
var express = require('express');
var router = express.Router();
var request_m = require('request')
router.post('/', function(req,res, next){
const custom_message = req.body.custom_message
io.sockets.emit('newMessage', {call: custom_message})
next();
})
return router
}
她是前端:
import React, {Component} from 'react';
import io from 'socket.io-client'
const socket = io('/');
class App extends Component {
constructor(){
super()
this.state={
}
}
componentDidMount(){
socket.on('newMessage', function (data) {
this.setState({newMessage: data.call})
}
}
render(){
return (
<div> </div>
);
}
}
export default App;
谢谢大家!
另外一个注意事项:在socketFile中我最初也有
io.on('connection', function(socket){
...
})
但这似乎是不必要的,因为我不需要监听任何事情,只有当该路由器被外部API攻击时才会发出。在任何情况下结果都是一样的。要清楚的是,当访问socketFile中的路由并且它现在有一个custom_message(让我们称之为“hello world&#39;”)时,服务器会发出&#39; hello世界&#39;两次。