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

Node.js中推荐注册功能的多条件校验实现疑问

解决Node.js推荐机制注册场景的多条件判断问题

问题梳理

你需要处理三种用户注册场景:

  • 存在有效推荐链接:同时向User表和affiliation表写入数据
  • 存在无效推荐链接:返回「请检查链接」的错误提示
  • 无推荐链接:仅向User表写入数据

当前核心问题在于check_affiliation_link仅返回布尔值,无法获取推荐用户的ID用于关联,且注册控制器未完成多分支逻辑的处理。

解决方案

1. 修改推荐链接校验服务

将服务改为直接返回查询到的推荐用户(而非布尔值),后续可直接使用其ID关联新用户:

exports.check_affiliation_link = async (affiliationHandle) => {
  // 直接返回查询结果,不存在则为null
  return await User.findOne({ affiliation: affiliationHandle });
};

2. 完善注册控制器的多条件逻辑

引入Mongoose事务保证数据一致性(避免创建用户后affiliation写入失败的情况),同时清晰处理三种场景:

exports.register = catchAsync(async (req, res) => {
  const session = await mongoose.startSession();
  session.startTransaction();

  try {
    // 基础校验:检查手机号/邮箱是否已注册
    const isValidated = await userService.validateInDatabase(req);
    if (!isValidated) {
      await session.abortTransaction();
      session.endSession();
      return res.status(409).json({ error: "Phone number or email is already registered" });
    }

    // 在事务内创建新用户
    const user = await userService.create(req.body, { session });

    const affiliationHandle = req.body.affiliation_handle;
    if (affiliationHandle) {
      // 场景1/2:存在推荐链接的情况
      const referrerUser = await affiliationService.check_affiliation_link(affiliationHandle);
      if (!referrerUser) {
        // 推荐链接无效,回滚事务
        await session.abortTransaction();
        session.endSession();
        return res.status(400).json({ error: "请检查链接" });
      }

      // 向affiliation表写入关联数据(事务内执行)
      await Affiliation.create([{
        userId: user._id,
        affiliatedBy: referrerUser._id,
        affiliation_code: affiliationHandle
      }], { session });
    }

    // 发送验证token
    const token = await verificationService.sendVerification(user);

    // 提交事务,确认所有操作完成
    await session.commitTransaction();
    session.endSession();

    return res.status(201).json({ user, token });
  } catch (error) {
    // 异常时回滚事务,避免数据不一致
    await session.abortTransaction();
    session.endSession();
    console.trace(error);
    return res.status(400).json({ message: error.message });
  }
});

3. 调整用户创建方法支持事务

确保userService.create能接收session参数,保证用户创建操作在事务内执行:

// userService中的create方法示例
exports.create = async (userData, options = {}) => {
  // 使用数组形式传入数据,兼容Mongoose的session参数
  const [newUser] = await User.create([userData], options);
  return newUser;
};

关键细节说明

  • 事务保障:通过Mongoose会话事务,确保User和affiliation数据的原子性,避免部分写入的异常情况。
  • 分支清晰:明确区分无推荐链接、有效推荐链接、无效推荐链接三种场景的处理逻辑。
  • 错误回滚:任何步骤失败都立即回滚事务,保证数据完整性。

内容的提问来源于stack exchange,提问作者John Oliver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:24:39