NodeJS server.js中location.href跳转失效问题求助
NodeJS 后端验证密码后跳转失效问题解决
问题根源
你在后端代码里直接写 location.href = "/login" 完全错误——location 是浏览器端的 API,NodeJS 后端根本不识别这个对象;而且 res.json() 是用来返回 JSON 格式数据的,不能这么写。至于换成 res.send('success') 没生效,大概率是前端没正确处理后端的响应结果。
另外原代码里还有个小错误:if(cpassword.value) 判断逻辑错误,cpassword 是从 req.body 解构出来的普通字符串,没有 value 属性,应该改成判断是否为空值。
修复方案
方案一:后端返回状态标识,由前端处理跳转
适合前端用 AJAX(fetch/axios)提交表单的场景
后端代码修改:
app.get('/current-pass', (req, res) => { res.sendFile(path.join(staticPath, "currentPass.html")); }) app.post('/current-pass', (req, res) => { let { email, cpassword } = req.body; // 修正空值判断逻辑 if(!cpassword){ return res.json({ 'alert': "please enter your current password"}); } db.collection('users').doc(email).get() .then(user => { // 增加用户不存在的判断 if(!user.exists){ return res.json({'alert': '用户不存在'}); } bcrypt.compare(cpassword, user.data().password, (err, result) => { if(err){ return res.json({'alert': '验证出错,请稍后重试'}); } if(result){ // 返回成功状态,让前端执行跳转 return res.json({ success: true }); } else{ return res.json({'alert': 'current password is incorrect'}); } }) }) // 捕获数据库请求错误 .catch(err => { return res.json({'alert': '数据库请求失败'}); }) })
前端代码补充(在 currentPass.html 里添加表单提交处理):
// 假设你的表单有对应的id document.getElementById('password-form').addEventListener('submit', async (e) => { e.preventDefault(); // 阻止表单默认提交行为 const formData = new FormData(e.target); const email = formData.get('email'); const cpassword = formData.get('cpassword'); try { const response = await fetch('/current-pass', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, cpassword }) }); const data = await response.json(); if(data.success){ // 前端执行跳转 window.location.href = '/login'; } else if(data.alert){ alert(data.alert); } } catch (err) { console.error('请求出错:', err); alert('请求失败,请稍后重试'); } });
方案二:后端直接重定向(适合普通表单提交场景)
如果前端是普通 HTML 表单,没有用 AJAX 提交,直接让后端返回重定向响应即可:
后端代码修改:
// 仅修改密码验证成功后的逻辑 if(result){ // 后端直接重定向到登录页 return res.redirect('/login'); }
这种情况下要确保前端表单没有阻止默认提交行为,表单的 method 为 POST、action 为 /current-pass。
内容的提问来源于stack exchange,提问作者Ahmed Sajid
相关产品推荐
相关产品推荐

