基于ReactJs+Adonisjs+Getstream,如何实现帖子收藏功能?
解决方案:基于Getstream-io实现帖子收藏功能
核心思路
利用Getstream的自定义用户收藏Feed来实现,既保留Getstream自带的活动更新、分页排序能力,又能同步展示原帖子的最新互动内容,完全替代自有数据库存储收藏的方案。
具体实现步骤
1. 配置自定义收藏Feed类型
在Getstream控制台新增一个bookmark类型的Feed(名称可自定义),每个用户对应一个独立的收藏Feed,格式为bookmark:{{user_id}}。
2. 收藏操作:将帖子活动同步到收藏Feed
用户点击收藏时,后端执行以下操作:
- 从原社区Feed中获取目标帖子的活动数据
- 将该活动完整复制到用户的
bookmarkFeed中,可额外添加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
相关产品推荐
相关产品推荐

