为什么我的Express GET方法返回ObjectId类型匹配错误提示?
问题根因
- 你前端ajax请求的URL中
:userId是路由占位符,没有替换为真实的用户ID值,导致后端拿到的userId是字符串:userId,不符合MongoDB ObjectId的格式,触发mongoose类型校验报错,你控制台看到的就是报错返回的信息 - 前端代码存在语法错误:
let = userId = $('#userId').val();多写了一个等号,会直接抛出语法异常 - 你使用路由参数传值,不需要额外在ajax的
data字段传递userId,属于冗余配置
修正后的代码
前端JS部分
let thisArray = [] // 修正语法错误,移除多余的等号 let userId = $('#userId').val(); // 可选校验:先判断userId是否存在,避免无效请求 if (!userId) { console.error('用户ID为空,请检查取值逻辑'); return; } $.ajax({ method:'GET', // 替换路由占位符为真实的userId url:`/auth/marcacoesGET/${userId}`, dataType: 'json', // 移除冗余的data传参 success:function(marcacao){ thisArray = marcacao buildTable(thisArray); console.log(thisArray) }, // 可选添加错误回调,方便排查请求异常 error: function(err) { console.error('请求失败', err); } }) function buildTable(marcacao){ let table = document.getElementById('tabelaCliente') for(let i = 0; i < marcacao.length; i++){ let row = `<tr> <td>${marcacao[i].address}</td> <td>${marcacao[i].date}</td> <td>${marcacao[i].hour}</td> <td>${marcacao[i].type}</td> <td>${marcacao[i].state}</td> </tr>` table.innerHTML += row } }
后端可选优化
可以先校验传入的userId是否为有效的ObjectId,避免无效查询:
const mongoose = require('mongoose'); exports.getMarcacoes = async(req, res) => { const { userId } = req.params; // 先校验ID格式是否合法 if (!mongoose.Types.ObjectId.isValid(userId)) { return res.status(400).json({message: '无效的用户ID格式'}); } try { const user = await User.findById(userId).populate('marcacaoCliente'); console.log('user', user); res.status(200).json(user?.marcacaoCliente || []); } catch (err) { res.status(500).json({message:err}); } }
内容的提问来源于stack exchange,提问作者Lolstroop
相关产品推荐
相关产品推荐

