首页
/ Laf云开发中数据库查询方法变更解析

Laf云开发中数据库查询方法变更解析

2025-05-29 17:18:08作者:谭伦延

背景介绍

Laf是一个基于云开发的平台,提供了云函数、云数据库等能力,帮助开发者快速构建应用。在使用过程中,开发者可能会遇到一些API变更带来的兼容性问题,比如数据库查询方法的调整。

问题现象

开发者在按照官方文档实现用户注册功能时,遇到了db.collection(...).where is not a function的错误提示。这表明文档中的示例代码使用了旧版本的数据库查询API,而实际运行环境已经更新为新版本。

新旧API对比

旧版本查询方式

const exists = await db.collection("users")
  .where({ username: username })
  .count()

新版本查询方式

const exists = await db.collection("users")
  .countDocuments({ username: username })

主要变更点:

  1. where()方法已被移除
  2. 查询条件直接作为参数传递给countDocuments()
  3. 方法名从count()变更为countDocuments()

完整解决方案

用户注册云函数实现

import cloud from "@lafjs/cloud";
import { createHash } from "crypto";

const db = cloud.mongo.db

export default async function (ctx: FunctionContext) {
  const username = ctx.body?.username || "";
  const password = ctx.body?.password || "";

  // 参数校验
  if (!/^[a-zA-Z0-9]{3,16}$/.test(username))
    return { error: "用户名格式不正确" };
  if (!/^[a-zA-Z0-9]{3,16}$/.test(password))
    return { error: "密码格式不正确" };

  // 检查用户名是否已存在
  const exists = await db
    .collection("users")
    .countDocuments({ username: username })

  if (exists > 0) return { error: "用户名已存在" };

  // 创建用户
  const res = await db.collection("users").insertOne({
    username: username,
    password: createHash("sha256").update(password).digest("hex"),
    created_at: new Date(),
  });

  console.log("用户注册成功: ", res.insertedId);
  return { data: res.insertedId };
};

用户登录云函数实现

import cloud from "@lafjs/cloud";
import { createHash } from "crypto";

const db = cloud.mongo.db

export default async function (ctx: FunctionContext) {
  const username = ctx.body?.username || ""
  const password = ctx.body?.password || ""

  // 验证用户登录
  const user = await db
    .collection("users")
    .findOne({
      username: username,
      password: createHash("sha256").update(password).digest("hex"),
    })

  if (!user) return { error: "用户名或密码错误" };

  // 生成JWT Token
  const user_id = user._id;
  const payload = {
    uid: user_id,
    exp: Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 7,
  };

  const access_token = cloud.getToken(payload);

  return {
    uid: user_id,
    access_token: access_token,
  };
};

最佳实践建议

  1. 密码安全:示例中使用SHA256哈希算法存储密码,实际生产环境中建议使用更安全的bcrypt等专门用于密码存储的算法

  2. 参数校验:对用户输入进行严格校验,防止注入攻击

  3. 错误处理:提供清晰的错误信息,但不要泄露系统内部细节

  4. 日志记录:关键操作记录日志,便于问题排查

  5. API版本:关注官方文档更新,及时了解API变更

总结

Laf平台不断优化迭代,API也会相应调整。开发者遇到类似问题时,可以:

  1. 查阅最新官方文档
  2. 检查API变更日志
  3. 在社区寻求帮助
  4. 通过控制台测试验证API调用方式

掌握这些方法后,就能快速适应平台变化,高效开发云应用。

登录后查看全文
热门项目推荐
相关项目推荐