Node.js登录系统跳转问题求助:验证后无法正确跳转页面
Node.js登录系统跳转问题修复方案
核心问题
你在后端代码里调用了浏览器端的window.location.replace,这是前端专属API,Node.js环境中不存在window对象,所以跳转完全无效。同时你的代码还存在异步逻辑错误、SQL注入风险等问题,以下是完整修复方案:
具体问题与修复步骤
替换后端跳转方式
后端跳转必须使用Express提供的响应方法:- 跳转至指定路由用
res.redirect() - 渲染页面用
res.render()
- 跳转至指定路由用
修正异步查询逻辑
con.query是异步操作,原代码中res.render("dashboard")会在数据库查询完成前执行,导致登录验证逻辑完全失效。必须把页面渲染/跳转逻辑放在查询的回调函数内部。解决SQL注入风险
禁止直接将用户输入拼接进SQL语句,改用参数化查询方式,避免数据库被恶意篡改。密码安全优化(强烈建议)
数据库禁止存储明文密码,使用bcrypt等工具对密码进行哈希加密后再存储,验证时对比哈希值而非明文。
修复后的代码
const express = require('express'); const app = express(); const mysql = require('mysql'); const path = require('path'); const bodyParser = require('body-parser'); // 建议引入bcrypt做密码加密(需先npm install bcrypt) // const bcrypt = require('bcrypt'); const ifl = path.join(__dirname, '/views/assets/'); const urlencodedParser = bodyParser.urlencoded({ extended: false }); app.set('view engine', 'ejs'); app.use('/assets', express.static(ifl)); // 数据库连接配置 const con = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "anoe" }); // 登录页面 app.get("/login", (req, res) => { res.render("login"); }); // 登录验证接口(建议改用POST方法,避免密码出现在URL中) app.get("/loginn", (req, res) => { const { email, pass } = req.query; // 参数化查询,防止SQL注入 const query = 'SELECT * FROM users WHERE email = ?'; con.query(query, [email], (err, result) => { if (err) { console.error(err); return res.redirect('/login'); // 数据库错误跳转回登录页 } // 未找到对应用户 if (result.length === 0) { return res.redirect('/login'); } // 若使用bcrypt加密密码,改用以下逻辑验证 // bcrypt.compare(pass, result[0].pass, (bcryptErr, isMatch) => { // if (bcryptErr || !isMatch) { // return res.redirect('/login'); // } // res.render("dashboard"); // }); // 明文密码验证(仅临时测试用,上线必须替换为加密验证) if (result[0].pass === pass) { res.render("dashboard"); } else { res.redirect('/login'); } }); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
额外建议
- 登录请求改用
POST方法,避免密码暴露在URL的查询参数中 - 给登录失败场景添加错误提示,比如通过
req.flash传递错误信息到登录页 - 使用数据库连接池替代单个连接,提升服务性能和稳定性
内容的提问来源于stack exchange,提问作者ATHEN
相关产品推荐
相关产品推荐

