我正在使用angular 6客户端构建服务器,作为服务器的一部分,我需要使用Socket io构建博客。 这是我在服务器中的套接字io代码
io.on('connection', function (socket) {
if(!socket.request.user.logged_in)
socket.disconnect();
console.log("made a connection");
console.log(socket.request.user);
socket.on('join',async function (data) {
if(await Blogs.IsUserInBlog(socket.request.user.email,data.room))
socket.join(data);
});
socket.on('post',function (data) {
Blogs.ADDPOST(data.msg,socket.request.user.email,data.room);
io.to(data.room).emit('post',{msg:data.msg,user:socket.request.user.email});
});
}
我还需要查看用户数据(登录后),正如您在上面的代码中看到的那样,我使用了socket.request.user变量,因为我使用了password-socket.io,这是该代码< / p>
io.use(passportSocketIo.authorize({
secret: 'IHopeThisWorks',
store: new MongoDB({ url: 'mongodb://localhost/BookShop'}),
success: function(data, accept){
console.log('successful connection to socket.io');
accept(null, true);
accept(); },
fail:function(data, message, error, accept){
// if(error)
// throw new Error(message);
console.log('failed connection to socket.io:', message);
accept(null, false);
if(error)
accept(new Error(message));}
}));
但是,每当我发布代码(使用emit('post'))时每次添加此代码后,事件都会发送两次。
我查看了一下,在调试中看到socket.on('connection')
被调用了两次,这是我的角度服务
export class BlogService {
private socket = io('http://localhost:3000');
constructor() {}
joinRoom(blog:Blog) {
this.socket.emit('join', blog.name);
}
sendPost(msg:string,room:string) {
console.log(msg);
this.socket.emit("post",{msg:msg,room:room});
}
getMessages(): Observable<{msg:string,user:string}> {
return new Observable<{msg:string,user:string}>(observer =>{
this.socket.on('post', (data) => {
observer.next(data);
});
});
}
}
在chrome调试器中,我看到sendPost
函数仅被调用一次,但是在服务器中却被调用了两次,显然在连接中存在一个问题,使它两次连接到同一用户,为什么? ?