如何在成功发射Angular 8时处理从service.ts到component.ts的socket.io确认

问题描述 投票:1回答:1

当客户端使用socket.io向服务器发出新消息时,服务器将使用回调fn()发送对新创建的messageId的确认。我能够在service.ts中记录messageId,但是无法找出一种将messageId“获取”到组件.ts的方法(以便使用ID更新新创建的消息)。使用下面的代码设置方式,即使我在service.ts中使用of(newMsgId)返回了新消息ID的Observable,也遇到了一个角度错误,说我无法订阅this.appService.newMessage()。如果可以添加更多信息以帮助请lmk

server.js
--------

socket.on('newStaffMessage', function (data, fn) {
    var msg = new Message({
      sender: data.senderId,
      content: { text: data.content.text, attachment: null },
      dateTime: new Date(),
    });

    msg.save((err, messageDoc) => {
      Conversation.findByIdAndUpdate(
        { _id: data.conversationId },
        {
          $push: { messages: messageDoc._id },
        },
        { new: true },
        function (err, convoDoc) {
          if (!err) {
            User.findById(data.senderId, function (err, userDoc) {
              const payload = {
                conversationId: convoDoc._id,
                _id: messageDoc._id,
                content: {
                  text: msg.content.text,
                  attachment: msg.content.attachment,
                },
                dateTime: msg.dateTime,
                sender: {
                  _id: userDoc._id,
                  firstName: userDoc.firstName,
                  lastNameInitial: userDoc.lastNameInitial,
                },
              };

              io.in(convoDoc._id).emit('newStaffMessage', payload);
              fn({messageId: messageDoc._id});
            });
          } else {
            console.log(err);
          }
        }
      );
    });
  });
service.ts
----------

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, Observer, of } from 'rxjs';
import * as io from 'socket.io-client';

@Injectable({
  providedIn: 'root',
})
export class AppService {
  private socket = io('http://localhost:3000');

  constructor(private http: HttpClient) {}

  newMessage(msg) {
    this.socket.emit('newStaffMessage', msg, (newMsgId) => {
      return of(newMsgId);
    });
  }
component.ts
------------
this.appService.newMessage(newMessage).subscribe(data => {
      console.log(data);
    })
javascript node.js angular socket.io mean-stack
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.