You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js+EJS登录页面点击后仅刷新不跳转问题求助

问题原因与解决方案

核心问题1:表单默认提交行为未完全阻止

登录按钮为type="submit",点击后会触发表单默认同步提交,导致页面直接刷新,覆盖前端fetch异步请求的结果。当前代码仅在验证失败时阻止默认行为,验证通过时未做处理,因此页面依然会刷新。

修改前端JS代码:

在点击事件开头就阻止默认行为,确保异步请求能正常执行:

button.addEventListener("click", (event) => {
  // 始终阻止表单默认提交行为
  event.preventDefault();
  
  let check = checkUserNameValue(userName.value);
  // 用逻辑与合并两个验证结果,避免覆盖
  check = check && checkPasswordValue(password.value);

  if (!check) {
    return false;
  }

  let obj = {
    userName: userName.value,
    password: password.value,
  };
  fetch("/loginAdmin", {
    method: "post",
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify(obj)
  })
  .then(response => {
    if (response.ok) {
      // 登录成功,获取服务端返回的HTML替换当前页面
      return response.text();
    } else {
      // 登录失败,获取错误信息并更新页面提示
      return response.text().then(text => { throw new Error(text); });
    }
  })
  .then(html => {
    document.documentElement.innerHTML = html;
  })
  .catch(err => {
    console.error(err);
    // 更新登录页面的错误提示
    document.querySelector("h3[style='color: red;']").textContent = "اسم المستخدم او كلمة المرور خاطئة";
  });
});

核心问题2:服务端存在未定义变量

服务端代码中savedData未声明,需修正为数据库查询返回的结果:

app.post("/loginAdmin", async(req, res) => {
  try {
    let adminPassword = req.body.password;
    let adminUserName = req.body.userName;

    let admin = new Admin();

    // 接收数据库查询结果,假设selectAdminFromDBForLogin返回用户数据或false
    const savedData = await admin.selectAdminFromDBForLogin(adminUserName, adminPassword);
    if(savedData === false) {
      res.render("admin/login.ejs", {message:'اسم المستخدم او كلمة المرور خاطئة'});
      return;
    }
    console.log(savedData[0].adminID);
    res.render("admin/mainPage.ejs", {
      ID: savedData[0].adminID,
      name: savedData[0].adminName,
      userName: savedData[0].adminUserName,
      gender: savedData[0].adminGender,
      validity: savedData[0].adminValidity,
    });

  } catch (err) {
    console.log(err);
    res.status(500).send(err.message);
  }
});

可选优化:改用传统表单同步提交(更简单)

如果不需要异步提交,可直接让表单按传统方式提交,省去fetch处理:

修改EJS表单代码:

添加method="post"、action="/loginAdmin",并给输入框加name属性(服务端req.body依赖该属性取值):

<form method="post" action="/loginAdmin">
  <div class="col-md-12 mb-4">
    <div class="form-outline">
      <input type="text" id="userName" name="userName" class="form-control form-control-lg userName" placeholder="أدخل اسم المستخدم"/>
    </div>
  </div>

  <div class="col-md-12 mb-4">
    <div class="form-outline">
      <input type="password" id="password" name="password" class="form-control form-control-lg password" placeholder="أدخل كلمة المرور"/>
    </div>
  </div>

  <!-- 其余按钮保持不变 -->
</form>

修改前端JS代码:

仅保留验证逻辑,验证失败时阻止提交:

button.addEventListener("click", (event) => {
  let check = checkUserNameValue(userName.value);
  check = check && checkPasswordValue(password.value);

  if (!check) {
    event.preventDefault();
    return false;
  }
  // 验证通过,表单自动提交到服务端,由服务端直接渲染页面
});

内容的提问来源于stack exchange,提问作者Almashdaly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:27:31