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

基于ReactJs+Adonisjs+Getstream,如何实现帖子收藏功能?

解决方案:基于Getstream-io实现帖子收藏功能

核心思路

利用Getstream的自定义用户收藏Feed来实现,既保留Getstream自带的活动更新、分页排序能力,又能同步展示原帖子的最新互动内容,完全替代自有数据库存储收藏的方案。

具体实现步骤

1. 配置自定义收藏Feed类型

在Getstream控制台新增一个bookmark类型的Feed(名称可自定义),每个用户对应一个独立的收藏Feed,格式为bookmark:{{user_id}}。

2. 收藏操作:将帖子活动同步到收藏Feed

用户点击收藏时,后端执行以下操作:

  • 从原社区Feed中获取目标帖子的活动数据
  • 将该活动完整复制到用户的bookmark Feed中,可额外添加verb: 'bookmarked'字段标记为收藏行为
  • 在自有数据库中记录user_id与post_id的关联(用于后续同步互动更新)

Adonisjs后端代码示例:

const streamClient = require('getstream').connect(process.env.STREAM_API_KEY, process.env.STREAM_API_SECRET);

async function handleBookmark(userId, postId, communityId) {
  // 1. 获取原社区Feed中的帖子活动
  const communityFeed = streamClient.feed('community', communityId);
  const { results: [originalActivity] } = await communityFeed.get({
    filter: { foreign_id: `post:${postId}` },
    limit: 1
  });

  if (!originalActivity) return;

  // 2. 将活动添加到用户收藏Feed
  const bookmarkFeed = streamClient.feed('bookmark', userId);
  await bookmarkFeed.addActivity({
    ...originalActivity,
    verb: 'bookmarked',
    actor: `user:${userId}`,
    foreign_id: originalActivity.foreign_id
  });

  // 3. 记录收藏关联到自有数据库
  await Database.table('bookmarks').insert({
    user_id: userId,
    post_id: postId,
    created_at: new Date()
  });
}

3. 同步原帖子的互动更新

当原帖子有点赞、评论等互动时,更新原社区Feed活动的同时,通过自有数据库的收藏关联记录,同步更新所有收藏用户的bookmark Feed中的对应活动:

async function updatePostInteractions(postId, updatedData, postCommunityId) {
  // 1. 更新原社区Feed的帖子活动
  const communityFeed = streamClient.feed('community', postCommunityId);
  await communityFeed.updateActivity({
    foreign_id: `post:${postId}`,
    ...updatedData // 比如likes_count、comments_count等字段
  });

  // 2. 获取所有收藏该帖子的用户
  const bookmarkers = await Database.table('bookmarks')
    .where('post_id', postId)
    .select('user_id');

  // 3. 同步更新每个用户收藏Feed中的活动
  for (const { user_id } of bookmarkers) {
    const bookmarkFeed = streamClient.feed('bookmark', user_id);
    await bookmarkFeed.updateActivity({
      foreign_id: `post:${postId}`,
      ...updatedData
    });
  }
}

4. 取消收藏操作

用户取消收藏时,从收藏Feed移除对应活动,并删除数据库中的关联记录:

async function handleUnbookmark(userId, postId) {
  const bookmarkFeed = streamClient.feed('bookmark', userId);
  await bookmarkFeed.removeActivity({ foreign_id: `post:${postId}` });
  
  await Database.table('bookmarks')
    .where('user_id', userId)
    .andWhere('post_id', postId)
    .delete();
}

5. 前端展示收藏列表

直接拉取用户的bookmark Feed数据,复用现有帖子展示组件即可:

React前端代码示例:

import { StreamClient } from 'getstream';

const streamClient = new StreamClient(process.env.REACT_APP_STREAM_API_KEY);

async function loadBookmarkedPosts(userId) {
  const bookmarkFeed = streamClient.feed('bookmark', userId);
  const { results } = await bookmarkFeed.get({ limit: 20, offset: 0 });
  
  // 将results传递给帖子列表组件渲染
  return results;
}

方案优势

  • 完全利用Getstream的Feed能力,无需自行实现分页、排序、实时更新逻辑
  • 收藏的帖子能实时同步原帖子的互动数据,解决自有数据库方案无法展示最新互动的问题
  • 前端可复用现有组件,开发成本低

内容的提问来源于stack exchange,提问作者Roronoa Zoro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:40:20