Express后端创建服务器接口Bug求助: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会触发两种错误情况:
- 当服务器不存在时,
serverExist是null,serverExist?.isHidden返回undefined,取反后为true,直接抛出"Server exist"错误,后续创建逻辑根本走不到 - 当**服务器存在且
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
相关产品推荐
相关产品推荐

