解锁后端简单性:使用 Convex 构建可扩展应用程序

**构建可扩展、高效的应用程序可能很有挑战性,对吧?特别是当你时间不多或参加黑客马拉松时。如果我告诉你有一个后端解决方案可以简化这个过程,你会怎么想?**

最近我正在做一个项目,第一次使用了 Convex 后端,你猜怎么着,感觉棒极了。

Convex 不仅仅是一个数据库,它还是为现代开发人员量身定制的全面后端解决方案。它提供从 TypeScript 中的云函数到实时数据同步的所有内容,让您可以完全专注于前端代码。这促使它越来越受欢迎。

是什么让它与众不同🤔🤔

  • 实时数据同步:我最喜欢的功能是,实时数据同步意味着需要先设置套接字 io,然后将其从后端发送到前端。相反,这里的数据在客户端应用程序和数据库之间实时同步,这使其成为协作或实时应用程序的理想选择。
  • 无服务器函数:Convex 提供无服务器函数,称为“Convex 函数”,它允许您运行后端逻辑而无需管理服务器。这些函数是用 JavaScript 或 TypeScript 编写的。
  • 内置身份验证:尽管有像 clerk、next auth 这样的服务可以与 Next.js + typescript 配合得很好,但 Convex 还支持用户身份验证,包括第三方提供商,因此您可以轻松地将用户登录添加到应用程序中,而无需设置自定义身份验证系统。
  • 可扩展数据库:Convex 的数据库可自动扩展,并旨在支持高并发性,因此它可以处理大型数据集和流量高峰。
  • 无模式数据模型:Convex 使用无模式数据模型,允许您存储灵活的数据结构,这对于快速发展的项目非常有益。
  • 这些是我个人使用的功能,还有更多功能,例如**ACID 事务**、**TypeScript 支持**、**安全和访问控制**、**自动缓存和优化**,您绝对可以尝试一下。

    现在让我们通过一个简单的“getGroupMembers”函数看看在普通后端和凸后端中的方法。

    让我们使用 MongoDB 和 Node.js 构建一个后端函数

  • 首先,我们通过典型的 JWT 验证用户的身份,如果发生错误,则仅返回 401 未授权的响应。
  • const identity = await verifyToken(req.headers.authorization);
      if (!identity) {
        res.status(401).send("Unauthorized");
        return;
      }
  • 用户通过身份验证后,我们将检索对话详细信息。此步骤涉及通过提供的对话 ID 查询 MongoDB 中的对话集合。
  • const conversation = await db.collection("conversations").findOne({ _id: conversationId });
      if (!conversation) {
        res.status(404).send("Conversation not found");
        return;
      }
  • 接下来,我们从用户集合中检索所有用户,并筛选出 ID 与对话参与者匹配的用户。
  • const users = await db.collection("users").find().toArray();
      const groupMembers = users.filter(user => conversation.participants.includes(user._id));
  • 最后,我们将 groupMembers 列表返回给客户端。此数据仅包括参与指定对话的用户。
  • res.status(200).send(groupMembers);

    **以下是上述代码片段的表示图**

    Normal backend fuction

    让我们使用 Convex 构建一个后端函数

  • Convex 使用 ctx.auth.getUserIdentity() 提供内置用户身份验证,可以轻松检查用户是否已登录。如果用户未通过身份验证,我们将抛出 ConvexError,它会自动向客户端返回“未授权”响应。
  • const identity = await ctx.auth.getUserIdentity();
      if (!identity) {
        throw new ConvexError("Unauthorized");
      }
  • 使用 Convex,数据库查询变得简单。使用 ctx.db.query,我们通过筛选与提供的对话 ID 匹配的内容来检索对话。
  • const conversation = await ctx.db.query("conversations")
        .filter((q) => q.eq(q.field("_id"), args.conversationId))
        .first();
      if (!conversation) {
        throw new ConvexError("Conversation not found");
      }
  • Convex 允许我们使用 ctx.db.query("users").collect() 查询所有用户。然后我们使用过滤器仅选择参与对话的用户。Convex 的内置数据检索方法使管理集合变得更加容易,而无需处理手动数据库连接。
  • const users = await ctx.db.query("users").collect();
      const groupMembers = users.filter((user) => conversation.participants.includes(user._id));
  • 就这样。由于 Convex 处理响应管理,因此只需从函数返回 groupMembers 即可将数据发送到客户端。
  • return groupMembers;

    **下面是凸处理后端的总体简化解释图 -**

    overall simplified convex architecture

    我如何在我的项目中使用 Convex

    我刚刚使用 Next.js、TypeScript 以及最重要的 Convex 后端重新创建了 freeCodeCamp MERN 堆栈书店项目。

    因此,如果您想了解如何使用 Convex 后端,那么您可以关注我的 github 项目,我已将我的技术堆栈从 MERN 堆栈转移到 NEXT.js + TS + Convex。