前端fetch请求卡住问题排查:邮件提交后端后无响应
问题定位与解决
核心原因:后端未返回响应
前端fetch发起请求后,会一直等待后端返回响应才会完成异步操作。你当前的后端代码只做了接收数据、调用查询,但没有向客户端返回任何响应,导致前端的await userSend()一直处于等待状态,看起来像是"卡住"了。
次要问题:异步查询未正确等待
MongoDB的findOne是异步操作,你的find1(emailC)如果是封装了这个方法的函数,直接赋值found=find1(emailC)不会等待查询完成,也无法把查询结果返回给前端。
关于定时器的疑问
未清除的setInterval或Timeout不会阻塞异步函数的响应接收。JS是单线程事件循环模型,异步网络请求(fetch)和定时器任务属于不同的任务队列,定时器只会在空闲时执行,不会影响fetch的响应处理。
修复方案
1. 修改后端接口,正确返回响应
把接口改为异步函数,等待查询完成后返回结果:
app.post("/collectEmail", async (req, res) => { const emailC = req.body; // 等待find1异步查询完成 const found = await find1(emailC); console.log(`${emailC.Email} Is collected from the front-end`); // 返回账号是否存在的结果给前端 res.json({ accountExists: !!found }); });
2. 前端处理后端响应
修改userSend函数,解析后端返回的响应并返回结果,方便后续流程使用:
async function userSend() { let input = document.getElementById("email").value; console.log("here3"); const res = await fetch(userD1, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ Email: input }) }); // 解析后端返回的JSON数据 const responseData = await res.json(); return responseData; }
3. 调整createAccount流程(可选)
如果userCheck是依赖查询结果的操作,可以直接在createAccount中使用userSend返回的结果,避免重复请求:
async function createAccount() { const checkResult = await userSend(); // 根据返回的结果处理后续逻辑,比如显示账号是否存在 console.log("账号是否存在:", checkResult.accountExists); // 如果需要,可以继续调用userCheck(如果它有其他作用) // let user = await userCheck(); }
内容的提问来源于stack exchange,提问作者Smiley_Guy
相关产品推荐
相关产品推荐

