Express + MongoDB 实现更新用户时用户名变化验证数据库是否存在,不变不验证

news/2025/2/27 23:56:56/

`User.findById()`:方法根据用户 ID 查找当前用户的信息,若用户不存在则返回 404 错误。

`User.findOne()`:方法检查新用户名是否已存在于数据库中。

`User.findByIdAndUpdate()`:方法更新用户信息,`new: true` 表示返回更新后的文档,`runValidators: true` 表示运行模型的验证器。

// 处理用户信息更新的路由app.put("/users/:id", async (req, res) => {try {const userId = req.params.id;const updateData = req.body;// 验证是否为有效的 ObjectIdif (!mongoose.Types.ObjectId.isValid(userId)) {return res.status(400).json({ message: "Invalid user ID" });}// 根据用户 ID 查找当前用户信息const currentUser = await User.findById(userId);if (!currentUser) {return res.status(404).json({ message: "User not found" });}// 检查用户名是否发生变化if (updateData.username && updateData.username !== currentUser.username) {// 验证新用户名是否已存在const existingUser = await User.findOne({username: updateData.username,});if (existingUser) {return res.status(409).json({ message: "Username already exists" });}}// 更新用户信息const updatedUser = await User.findByIdAndUpdate(userId, updateData, {new: true,runValidators: true,});res.json({ message: "User updated successfully", user: updatedUser });} catch (error) {console.error("Error updating user:", error);res.status(500).json({ error: "Internal Server Error" });}});


http://www.ppmy.cn/news/1575370.html

相关文章

登录逻辑结合redis

1. 用户登录 用户访问登录页面,输入用户名和密码,提交表单。 服务端验证用户名和密码: 如果验证成功,生成 ticket,并将 ticket 和用户 ID 存储在缓存中(如 Redis)。 将 ticket 放入 Cookie 中…

LeetCode 贪心算法经典题目 (C++实现)

121. 买卖股票的最佳时机 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返…

OpenCV开源机器视觉软件

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,广泛应用于实时图像处理、视频分析、物体检测、人脸识别等领域。它由英特尔实验室于1999年发起,现已成为计算机视觉领域最流行的工具之一,支持多种编程语言(如C++、Python、Java)和…

深度学习-131-RAG技术之基于Anything LLM搭建本地私人知识库的应用策略问题总结(二)

文章目录 1 AnythingLLM是如何工作的2 AnythingLLM中的几个关键参数和配置2.1 分块处理2.2 Embedding嵌入模型2.3 TopK检索召回2.4 LLM 大模型首选项2.5 减少幻觉的设定技巧3 告别幻觉和睁眼说瞎话3.1 关键原则3.2 关键机理剖析3.2.1 Pin固定的含义3.2.2 Chunk Size与向量数Vec…

2024/2/23 考试

第一题 One Clue 问题陈述 在数轴上有20000012000001块石头,这些石头的坐标分别为-1000000, -999999, -999998, \ldots, 999999, 1000000−1000000,−999999,−999998,…,999999,1000000。 其中,连续的KK块石头被涂成了黑色,其余的则是白…

Linux-IPC-消息队列

Linux IPC 之 消息队列(Message Queue) 在 Linux 中,消息队列(Message Queue) 是一种进程间通信(IPC)机制,允许进程通过一个消息队列在内核空间中交换数据。消息队列是基于 队列 数…

Java中JDK、JRE,JVM之间的关系

Java中的JDK、JRE和JVM是三个核心概念,其关系可概括为JDK > JRE > JVM,具体如下: 一、定义与作用 JDK(Java Development Kit) 定义:Java开发工具包,用于开发和编译Java程序。包含内容&…

C/C++ | 每日一练 (4)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 C/C | 每日一练 (4)题目参考答案基础容器序列容器std:…