我试图实时侦听socket.io事件,我在Node中有一个后端,发出它,并有一个前端Service在监听它,但是它仅在我重新加载页面后才显示在视图中。
我的应用程序将在几秒钟内发送很多事件(每个事件都是一个Post请求),在我发送一个Post请求之后,我的后端console.log是即时的(这就是我想要的),但是正如我所说,我的前端不是。
节点:
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请求时,将发出该事件,并更新视图(或日志等)。
答案 0 :(得分:0)
我认为事件在错误的范围内定义,并且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'
});
});