使用axios.get()校验用户存在性时遭遇404错误求助
问题解决建议
核心问题:请求方法不匹配
你前端用axios.get()发起GET请求,但后端配置的是router.post("/allusers/:username", getRival)——POST类型的路由。服务器找不到对应GET方法的/allusers/:username路由,因此返回404错误。
修复方案二选一:
- 修改前端请求方法为POST
把前端的axios.get改成axios.post:const response = await axios.post(`${allUsersRoute}/${rivalUsername}`); - 修改后端路由为GET
把后端的router.post改成router.get:
注:从语义上来说,校验用户是否存在属于查询操作,更适合用GET方法。router.get("/allusers/:username", getRival)
其他潜在问题修正
数据库查询字段不匹配
你的查询语句是User.findOne({ user }),这里的user是参数名,但通常用户模型的用户名字段是username,如果你的模型字段是username,应该改成:const isExist = await User.findOne({ username: user })否则会查询
user字段等于用户名的数据,大概率查不到结果。前端添加错误捕获
当前代码未处理请求失败的情况,建议用try/catch包裹,避免控制台抛出未捕获的Promise错误:const handlecreateChannel = async (e) => { e.preventDefault() try { console.log("rival: ", rivalUsername); console.log(`${allUsersRoute}/${rivalUsername}`) const response = await axios.get(`${allUsersRoute}/${rivalUsername}`); console.log("does rival exist ", !!response.data); // 直接判断返回数据是否存在 } catch (err) { console.error("请求失败:", err); // 可在此处添加用户提示,比如"用户不存在或请求出错" } };后端响应格式统一
当前后端在用户不存在时返回{status: false},存在时返回用户对象,建议统一格式,方便前端处理:module.exports.getRival = async (req, res, next) => { try{ const username = req.params.username const user = await User.findOne({ username }) if (!user){ return res.json({status: false, isExist: false}) } return res.json({status: true, isExist: true, user}) }catch(e){ next(e) } }
内容的提问来源于stack exchange,提问作者user14436230
相关产品推荐
相关产品推荐

