node.js - Socket.io 客户端只响应一次
问题描述
我正在创建一个快速服务器,它将导致 index.html 页面在接收到发布请求时重定向到新页面。一切正常,但只是第一次。我必须定期重新启动服务器才能正常工作。以下是一些代码片段。
//server.js
const app = express();
app.use(express.static(`${__dirname}/public`));
const server = http.createServer(app);
const io = socketIo(server, {'force new connection': true });
io.on('connection', (socket) => {
console.log('New client connected');
app.post('/redirect', (req,res) => {
socket.emit('redirect');
res.status(200).send('Redirected');
});
});
<body>
<!-- Jquery CDN -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<!-- Socket.IO -->
<script src="/socket.io/socket.io.js"></script>
<script>
let socket = io.connect({'force new connection': true });
socket.on('connect', () => {
console.log('Connected to Server');
});
socket.on('redirect', () => {
window.location.replace("https://google.com");
});
</script>
</body>
解决方案
主要问题是您的路由位于套接字连接侦听器中。一条路线应该只注册一次。并且connection
被多次触发。
const app = express();
app.use(express.static(`${__dirname}/public`));
const server = http.createServer(app);
const io = socketIo(server, {'force new connection': true });
app.post('/redirect', (req,res) => {
res.status(200).send('Redirected');
io.emit('redirect');
// io.to(someSocketOrRoom).emit('redirect');
});
io.on('connection', (socket) => {
console.log('New client connected');
});
如果您想在收到来自套接字外部的消息时向套接字发出,在这种情况下是 HTTP Post。您需要使用io.emit
发射到所有套接字,或io.to().emit
发射到特定的一个。
现在,使用 socket.io 重定向没有多大意义,如果您发布到/redirect
为什么不直接使用 重定向用户res.redirect
,而不发出任何东西。
推荐阅读
- java - Spock测试方法中无法加载Spring上下文
- java - 在 android 应用程序中更改语言的选项
- python - 如何使用 Python 的 requests 模块上传非 utf-8 编码的文件?
- azure - 如何列出 Azure 租户中的所有资源?
- python-3.x - Blackbaud CRM 的组成记录的 ContextRecordID 的正确格式是什么?(转换数据类型时出错)
- angular - Firebase图像URL不起作用Angular NgStyle
- javascript - 在vue js中使用await嵌套axios调用
- javascript - 到下午 5 点时自动显示弹出窗口而不刷新(实时)
- python - 训练 LSTM 时跑出 Ram
- python - 如何将runId传递给由lambda的工作流触发的粘合作业?(Python)