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

Express中res.sendFile加载HTML失败的登录流程问题

问题分析与解决方案

你的核心问题在于用AJAX请求处理服务器端重定向——AJAX是异步HTTP请求,它会接收服务器返回的重定向响应(3xx状态码),但不会触发浏览器的页面跳转,这就是为什么res.redirect('/homepage')看起来没起作用的原因。另外,你的/homepage路由里还有个小问题:req.status不是正确的属性,中间件应该把用户验证结果放在其他自定义属性里。

下面是具体的修复方案:

1. 前端AJAX逻辑调整:去掉多余的/reroute请求,直接前端跳转

既然已经拿到了token并存入localStorage,完全不需要再发一次AJAX去请求重定向,直接在第一个AJAX的success回调里让浏览器跳转即可。这样浏览器会发起全新的GET请求到/homepage,服务器的验证和页面返回逻辑就能正常工作。

修改后的前端代码:

$(document).on("click", "#login", (e) => { 
    const email = $('#logemail').val().trim(); 
    const pass = $('#password').val().trim(); 
    $.ajax({ 
        url: "http://localhost:4000/checkuserexists", 
        type: "POST", 
        dataType: "JSON", 
        data: { email: email, pass: pass }, 
        success: function(data, textStatus, request) { 
            console.log(data) 
            if (data.message === "authorised") { 
                const token = request.getResponseHeader('access-token'); 
                localStorage.setItem("access-token", token); 
                // 直接让浏览器跳转至首页,替代AJAX请求重定向
                window.location.href = "http://localhost:4000/homepage";
            } else { 
                $('.alertbox').show(); 
                $('.alertbox').text("User unauthorised"); 
            } 
        } 
    }) 
})

2. 修正/homepage路由的用户验证判断

你的token_middleware应该是用来验证JWT并判断用户是否存在的,它不太可能把结果存在req.status(这是HTTP响应状态码的内置属性),通常会自定义一个属性,比如req.user或者req.isAuthorized。假设你的中间件验证通过后会设置req.isAuthorized = true,修改路由代码:

const express = require('express'); 
const path = require('path'); 
const token_middleware = require('../middlewares/jwtauth'); 
const router = express.Router(); 
router.use(express.static(path.join(__dirname, "../public"))) 

router.get('/', token_middleware, (req, res) => { 
    // 替换成中间件实际设置的授权标识属性
    if (req.isAuthorized || req.user) { 
        res.sendFile(path.join(__dirname, "../public/homepage.html")); 
    } else { 
        res.redirect('/'); 
    } 
}) 

module.exports = router;

3. 可选:移除/reroute路由(如果不再需要)

既然已经通过前端直接跳转,/reroute路由就没有存在的必要了,可以直接删除它,简化你的路由结构。

额外提示

  • 确保你的token_middleware在验证token时,会从请求头(req.header('access-token'))获取token并验证,验证通过后给req添加对应的授权标识。
  • 前端跳转后,新的请求需要携带token到服务器,你可以通过全局AJAX配置自动添加请求头,比如用jQuery的$.ajaxSetup:
    $.ajaxSetup({
        beforeSend: function(xhr) {
            xhr.setRequestHeader('access-token', localStorage.getItem('access-token'));
        }
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:22:39