React+MongoDB求职网站:保存职位时无法通过_id检测已存在项
问题描述
我使用React和MongoDB开发求职门户网站,实现用户登录后保存职位的功能,已创建职位存储模型和控制器。在保存职位前,尝试通过req.params获取的_id和req.payload获取的userId检测该职位是否已存在,但检测失效,每次都会创建新的职位对象。
控制器代码
exports.savedJobsController = async (req,res) =>{ console.log("Inside Saved Jobs Controller"); const {title,salary,email,company,location,description,category,jobType,experience,vacancy,deadline} = req.body const {id} = req.params const userId = req.payload console.log(`user id is : ${userId} and id is ${id}`); try { const existingJob = await savedjobs.findOne({_id:id,userId}) console.log(`exist ${existingJob}`); if(existingJob){ res.status(406).json("Job Already Saved to Your Collection!") }else{ const newJob = new savedjobs({ title,salary,email,company,location,description,category,jobType,experience,vacancy,deadline,userId }) await newJob.save() res.status(200).json(newJob) console.log(`Saved job is ${newJob} `); } } catch (error) { res.status(401).json(error) console.log(error); }
问题分析与解决方案
以下是可能导致检测失效的原因和对应解决办法:
查询条件逻辑错误
你当前用{_id:id, userId}查询,这里的_id是MongoDB自动生成的文档ID,而非你要保存的职位本身的ID。要检测「用户是否已保存某一特定职位」,应该用职位的原始ID(比如模型里的jobId字段)作为查询条件,而非文档的_id。修改查询语句:// 假设模型中职位ID字段为jobId const existingJob = await savedjobs.findOne({jobId: id, userId})数据类型不匹配
req.params.id是字符串类型,若模型中职位ID或userId是ObjectId类型,字符串和ObjectId无法匹配,导致查询不到数据。需要将字符串转为ObjectId:const mongoose = require('mongoose'); // 转换职位ID const jobId = mongoose.Types.ObjectId(id); // 若userId也是字符串,同样转换 const userObjectId = mongoose.Types.ObjectId(userId); const existingJob = await savedjobs.findOne({jobId, userId: userObjectId})字段名拼写/大小写不一致
检查savedjobs模型中的字段名,比如是否是user_id而非userId,职位ID字段是否拼写错误。MongoDB字段名区分大小写,必须保证查询条件中的字段名和模型完全一致。日志排查辅助
修改控制台日志,打印完整的查询条件和结果,方便定位问题:console.log('查询条件:', {_id:id, userId}, '查询结果:', existingJob);
内容的提问来源于stack exchange,提问作者theslizzz
相关产品推荐
相关产品推荐

