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

Node.js登录系统跳转问题求助:验证后无法正确跳转页面

Node.js登录系统跳转问题修复方案

核心问题

你在后端代码里调用了浏览器端的window.location.replace,这是前端专属API,Node.js环境中不存在window对象,所以跳转完全无效。同时你的代码还存在异步逻辑错误、SQL注入风险等问题,以下是完整修复方案:

具体问题与修复步骤

  1. 替换后端跳转方式
    后端跳转必须使用Express提供的响应方法:

    • 跳转至指定路由用res.redirect()
    • 渲染页面用res.render()
  2. 修正异步查询逻辑
    con.query是异步操作,原代码中res.render("dashboard")会在数据库查询完成前执行,导致登录验证逻辑完全失效。必须把页面渲染/跳转逻辑放在查询的回调函数内部。

  3. 解决SQL注入风险
    禁止直接将用户输入拼接进SQL语句,改用参数化查询方式,避免数据库被恶意篡改。

  4. 密码安全优化(强烈建议)
    数据库禁止存储明文密码,使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:15:39