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

Express后端创建服务器接口Bug求助:isHidden判断致无法创建文档

问题:Express创建服务器接口判断isHidden时无法创建文档

问题场景

我在Express后端开发了一个游戏服务器管理接口,用于在数据库中创建服务器记录(仅存储游戏名和服务器名),代码如下:

const createServer = asyncHandler(async (req, res) => {
  const { gameName, serverName } = req.body;
  const serverExist = await Server.findOne({ serverName });

  if (!gameName || !serverName) {
    res.status(400);
    throw new Error("Please add game name / server name");
  }
  if (!serverExist?.isHidden) {
    // 换成if(serverExist)时功能正常
    res.status(401);
    throw new Error("Server exist");
  }
  // 通过JWT中的ID获取用户
  const user = await User.findById(req.user.id);
  if (!user) {
    res.status(401);
    throw new Error("User not found");
  }
  const server = {
    gameName,
    serverName,
    user: req.user.id,
  };
  await Server.create(server);
  res.status(201).json(server);
});

遇到的问题:

  • 使用!serverExist?.isHidden判断时,接口既不返回响应,也无法创建新服务器文档
  • 换成if(serverExist)判断时功能完全正常
  • 需求是允许用户重新创建已标记为isHidden的服务器,不想删除旧数据
  • 已确认服务器对象信息完整,但调用Server.create()时出问题,搞不懂加了isHidden判断为啥就创建失败了

问题原因

你的判断逻辑写反了!

!serverExist?.isHidden会触发两种错误情况:

  1. 当服务器不存在时,serverExist是null,serverExist?.isHidden返回undefined,取反后为true,直接抛出"Server exist"错误,后续创建逻辑根本走不到
  2. 当**服务器存在且isHidden为false**时,取反后也是true,抛出错误(这部分是你想要的)

也就是说,只要服务器不存在,代码就直接抛错,自然无法创建新服务器。


修复方案

把判断逻辑改成:如果服务器存在,并且isHidden为false,才抛错。这样既阻止重复创建非隐藏服务器,又允许创建新服务器或者重新创建已隐藏的服务器。

修改后的判断代码

if (serverExist && !serverExist.isHidden) {
  res.status(401);
  throw new Error("Server exist");
}

完整修复后的接口代码

const createServer = asyncHandler(async (req, res) => {
  const { gameName, serverName } = req.body;
  const serverExist = await Server.findOne({ serverName });

  if (!gameName || !serverName) {
    res.status(400);
    throw new Error("Please add game name / server name");
  }
  // 修正判断逻辑:仅当服务器存在且未隐藏时才阻止创建
  if (serverExist && !serverExist.isHidden) {
    res.status(401);
    throw new Error("Server exist");
  }
  // 通过JWT中的ID获取用户
  const user = await User.findById(req.user.id);
  if (!user) {
    res.status(401);
    throw new Error("User not found");
  }
  const server = {
    gameName,
    serverName,
    user: req.user.id,
  };
  await Server.create(server);
  res.status(201).json(server);
});

逻辑验证

  • 情况1:服务器不存在 → 跳过判断,执行创建逻辑 ✅
  • 情况2:服务器存在且isHidden=true → 跳过判断,执行创建逻辑 ✅
  • 情况3:服务器存在且isHidden=false → 抛错,阻止创建 ✅

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:10:28