javascript - 如何使用 Socket.io 实时监听事件
问题描述
我试图实时监听socket.io事件,我在Node中有一个后端,发出它,前端服务正在监听它,但它只在我重新加载页面后显示在视图中。
我的应用程序将在几秒钟内发送很多事件(每个事件都是一个 Post 请求),在我发送一个 post 请求后,我的后端 console.log 是即时的(这是我想要的),但正如我所说,我的前面-end 不是。
节点:
const event = req.body;
app.post('/webhook', (req, res) => {
io.sockets.on('connection', function (socket) {
socket.emit('event', require('util').inspect(event));
});
res.json({
status: 'ok'
});
});
服务:
observable:Observable<string>;
socket;
constructor() {
this.socket = io("http://localhost:8080");
}
getData(event: String) : Subject<any> {
let subj = new Subject;
this.socket.on(event, data => subj.next(data));
return subj;
}
零件:
constructor(private _eventsService : EventsService) {
this._eventsService.getData('event').subscribe(data => {
console.log(data); // Only logs after reload
});
}
基本上我想继续监听前端的事件,当我向 /webhook 发送 Post 请求时,将发出该事件,并且我的视图更新(或日志等)。
解决方案
我认为事件定义在错误的范围内,每次有帖子时都不应该调用 io.sockets.on('connection' 。
如果您每次都尝试向所有连接的客户端广播,那么我将摆脱 io.sockets.on('connection' 并使用:
const inspect = require('util').inspect;
app.post('/webhook', (req, res) => {
io.emit('event', inspect(req.body));
res.json({
status: 'ok'
});
});
如果您只想将事件发送回发布它的客户端,那么您需要在有效负载中包含 socket.id 并使用它将消息发送回客户端。假设 req.body 是一个对象,例如:
const inspect = require('util').inspect;
app.post('/webhook', (req, res) => {
if (req.body.socketId){
io.to(req.body.socketId).emit('event', inspect(req.body));
}
res.json({
status: 'ok'
});
});
推荐阅读
- postgresql - 在计算字段的 PostgreSQL 函数中使用 Hasura 会话
- arrays - 基于特定单元格隐藏/显示多个对象
- node.js - 将 node_modules 文件夹移动到不同的位置?
- scikit-learn - 如何在高斯混合模型中限制估计均值?
- javascript - jQuery DataTables:选中页面加载时的所有复选框
- java - 如何分别在每个字段的验证过程中实现错误输出?
- bash - 我可以在 sed 中使用 bash 关联数组作为替换吗?
- blazor-server-side - 在 Blazor 服务器端使用输入时间有奇怪的行为
- elixir - 编译错误 - User.__struct__/1 未定义,无法扩展 struct User
- c++ - 在某些平台上使用静态局部变量和静态函数的缺点