You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular中使用socket.io-client将发送者与接收者消息显示在不同区域

看起来你遇到的核心问题是socketID没有正确初始化传递,再加上HTML里的条件和样式对应错了,导致消息没法区分显示。我帮你一步步修复:

问题1:ChatService里的socketID没赋值

你在ChatService的constructor里收到了myId事件,但只是打印了id,没有把它赋值给this.socketID,导致发送消息时senderId是空的,前端自然没法比较。同时,其实socket连接后本身就有id属性,直接用this.socket.id更可靠,不用等myId事件。

修改ChatService的代码:

constructor() {
  this.socket = io('http://localhost:3000');
  // 可以保留myId事件,但同时赋值给socketID
  this.socket.on('myId', (id) => {
    console.log('from service', id);
    this.socketID = id;
  });
}

public sendMessage(message: any) {
  // 直接用socket.id作为senderId,确保不会为空
  this.socket.emit('sendMessage', { message: message, senderId: this.socket.id });
  console.log('Sender ID = ', this.socket.id);
}

问题2:组件里的socketId没有正确获取

你的组件在ngOnInit里直接拿this.chatService.socketID,但这个值可能还没被myId事件赋值(因为socket连接是异步的)。可以改成监听socket的连接事件或者myId事件来获取当前用户的id:

修改组件的ngOnInit:

ngOnInit(){
  // 监听socket连接成功事件,获取当前用户id
  this.chatService.socket.on('connect', () => {
    this.socketId = this.chatService.socket.id;
    console.log('this.socketID', this.socketId);
  });

  // 或者监听myId事件,二选一即可
  // this.chatService.socket.on('myId', (id) => {
  //   this.socketId = id;
  // });

  this.chatService.getNewMessage().subscribe((message: MessageModel) => {
    console.log('Sockit ID = ', message.senderId);
    this.messageList.push(message);
  });
}

问题3:HTML里的条件和样式搞反了

你的CSS里,my-chat是右对齐(自己的消息应该显示在右边),client-chat是左对齐(对方的消息),但HTML里的判断逻辑写反了:当是自己发的消息(socketId === message.senderId),你用了client-chat,导致自己的消息跑到左边去了。

修改HTML:

<div class="chats" *ngFor="let message of messageList"> 
  <div *ngIf="message"> 
    <!-- 自己发的消息用my-chat(右对齐) -->
    <div *ngIf="socketId === message.senderId" class="my-chat"> 
      {{message.message}} 
    </div> 
    <!-- 对方发的消息用client-chat(左对齐) -->
    <div *ngIf="socketId !== message.senderId" class="client-chat"> 
      {{message.message}} 
    </div> 
  </div> 
</div>

额外优化:确保消息对象的完整性

服务器端的代码其实没问题,不过可以明确把senderId一起广播,避免遗漏:

socket.on('sendMessage', (messageData) => { 
  console.log(messageData.senderId); 
  io.emit('recieveMessage', messageData); // 直接转发完整的消息对象
});

这样修改后,你应该就能看到自己的消息显示在右侧,对方的消息显示在左侧了。

内容的提问来源于stack exchange,提问作者Amir Shahzad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:12:44