Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 我可以通过Firebase云功能实现聊天功能吗?_Angular_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Angular 我可以通过Firebase云功能实现聊天功能吗?

Angular 我可以通过Firebase云功能实现聊天功能吗?,angular,firebase,google-cloud-firestore,google-cloud-functions,Angular,Firebase,Google Cloud Firestore,Google Cloud Functions,我正试图实现聊天功能,前端使用Angular,后端使用CloudFireStore的Cloud功能。前端和Firestore仅通过云功能进行通信。顺便问一下,这是一个好方法吗 我的问题是,如果我的用户所在的某个聊天室收到新消息,我的前端可能会实时更新 聊天室仅限于两个用户,但一个用户可以与其他用户拥有多个聊天室 我的代码: 云功能: chatroomsEndpoint.js: const chatroomsCollection = db.collection("chatrooms"); exp

我正试图实现聊天功能,前端使用Angular,后端使用CloudFireStore的Cloud功能。前端和Firestore仅通过云功能进行通信。顺便问一下,这是一个好方法吗

我的问题是,如果我的用户所在的某个聊天室收到新消息,我的前端可能会实时更新

聊天室仅限于两个用户,但一个用户可以与其他用户拥有多个聊天室

我的代码:

云功能:

chatroomsEndpoint.js:

const chatroomsCollection = db.collection("chatrooms");

exports.getAllChatroomsByUserId = async function (req, res) {
    try {
        let chatrooms = [];
        // console.log(req.params.user_id);

        const resultA = await chatroomsCollection.where("userA", "==", req.params.user_id).get();
        resultA.docs.map(chatroom => {
            return chatrooms.push(chatroom.data());
        })

        const resultB = await chatroomsCollection.where("userB", "==", req.params.user_id).get();
        resultB.docs.map(chatroom => {
            return chatrooms.push(chatroom.data());
        })

        return res.status(200).send(chatrooms);
    }
    catch (error) {
        console.log('Error getting chatrooms', error);
        return res.send(false);
    }
};
我和邮递员试过了,我得到了当前用户所在的所有聊天室

前端(带角度)

chat.service.ts:

constructor(
    private authService: AuthService,
    private http: HttpClient,
    private router: Router
  ) {
    this.headers.append('Content-Type', 'application/json');
  }

  getAllChatroomsByUserId() {
    return this.http.get(`${this.apiUrl2}/${this.authService.getUser().uid}`);
  }
聊天室-list.component.ts:

userChats$;

  constructor(
    public authService: AuthService,
    public chatService: ChatService,
    public router: Router,
    public userStoreService: UserStoreService
  ) { }

  ngOnInit() {
    this.userChats$ = this.chatService.getAllChatroomsByUserId();
  }
chatroom-list.component.html:

<ul>
    <li *ngFor="let chatroom of userChats$ | async">
      <a [routerLink]="'/' + chatroom.id">{{ chatroom.id }} - {{ chatroom.messages.length }} Messages </a>
    </li>
  </ul>
    来自Fireship,但在视频中,他是通过Angular和Firestore之间的直接通信来实现的。 我还重建了它,可以让它工作。 在该示例中还使用了snapshotChanges()-这就是实现实时更新的方法吗

    我已经找遍了所有可能的东西,但找不到什么


    如果还需要其他东西,我会更新它。

    我认为以您想要的方式使用云功能是不可能的。虽然有,但你很快就会遇到一个更大的问题。。。如何将新事件从服务器发送回浏览器

    正如您在视频中看到的,他在浏览器上使用Firestore侦听器(如.snapshotChanges)来侦听从数据库触发的事件。这在浏览器环境中起作用的原因是Firebase在浏览器和服务器之间打开了一个websocket,允许双方之间进行实时通信。。。更深入地说,这是因为Firestore内置了websocket支持。因此,如果您想构建一个应用程序来监听数据库,Firestore将允许您这样做

    不幸的是,云函数没有相同的功能。它们不像Firestore的WebSocket那样“保持开放”。事实上,如果你尝试一下,它们会在几分钟后超时。。。即使您调整了超时限制,您仍然会遇到其他问题。。。例如,如何处理断开的连接?(Firestore websockets将自动尝试重新连接并重新打开该频道),哪些用户正在收听什么?等关键是,云功能是一种简短的“只做一次”服务。。。他们不会“保持开放”并在15分钟以上的时间跨度内继续向客户端提供更新

    长话短说,如果你想让浏览器接收来自Firebase的实时更新,那么浏览器需要直接订阅那些Firestore事件——没有云功能中介——就像你在视频中看到的那样

    编辑:


    关于实时数据和云功能,还指出云功能并不适用于此类用例。

    我的答案是肯定的,您可以使用firebase云功能实现聊天功能。 这很简单,我已经在一些rxjs特性的帮助下实现了这个聊天功能

    为了实现实时性,是的,但它也确实比直接的firebase操作慢一点


    如果您需要帮助,请告诉我。

    经过漫长的一天的多次尝试,我已经认为这是不可能的。谢谢你的详细回答。如果我通过Angular to Firestore这样做,我还有另一个安全问题:你知道Firestore的安全规则是否足以阻止其他用户访问他们不参与的聊天吗?@ConstantinBeer乐于帮助:)是的,安全规则100%能够做到这一点。不过,请注意,如果您正在考虑让用户订阅所有聊天,并指望安全规则“过滤”他们没有权限查看的聊天。。。这种策略行不通。Firestore将拒绝“倾听所有内容”的尝试,因为该用户不允许听所有内容。@ConstantinBeer我记得当我学习Firestore安全规则时,Firebase官方团队非常有帮助。事实上,我记得他们都很好。也许值得你花时间,真不敢相信。几周前,当我开始学习Firebase时,我看了这段视频。我不相信能从视频中学到什么,但它确实帮了我很多。它几乎指出了我对使用安全规则所担心的一切。非常感谢!