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

localhost站点返回/welcome页时用户名数据重置问题修复

问题描述

需要修复JS文件逻辑缺陷、更新相关代码,解决每次返回站点初始页面时程序状态重置的问题。

现有程序功能
  • 站点运行在localhost环境下,程序启动后首先通过prompt弹窗提示用户输入用户名,该用户名作为用户所属聊天/频道的身份标识
  • 用户可创建、加入多个频道
  • 若两个客户端同时运行并加入同一聊天频道,即可实现消息即时收发、内容实时同步
  • 项目仓库地址:https://github.com/NilesDobbs/Assignment14
实现目标

用户输入用户名进入聊天房间后,若手动跳转访问/welcome路径,程序需保留已录入的用户名信息,不再重复弹出用户名输入提示,直接进入站点主功能页面。
目前已知排查方向为welcome.js文件的逻辑校验环节,该文件现有代码如下:

let username = prompt('Enter your name') 
        fetch("/welcome/createuser", {
        method : "POST",
        headers: {
            "Content-Type" : "application/json"
        },
        body: username
    })
    .then((response) => response.json())
        .then(user =>
            sessionStorage.setItem("user",JSON.stringify(user)))
问题根因

现有代码没有做本地缓存校验,welcome.js只要加载就无条件弹出输入框、发起创建用户的请求,完全没有读取之前存在sessionStorage里的用户数据,所以每次跳转回/welcome路径都会重置用户状态。
另外现有代码还存在一个请求格式错误:声明了Content-Type为application/json,但请求体直接传原始字符串,没有做JSON序列化,后端大概率无法正常解析参数。

修复方案
  • 页面加载第一步优先读取sessionStorage中已存储的用户信息,如果存在有效用户数据,直接初始化主页面功能,不再弹出输入框、不重复发起创建用户请求
  • 仅当本地不存在已存用户数据时,才弹出prompt要求输入用户名,同时增加用户名非空校验
  • 修正POST请求的请求体格式,将用户名序列化为标准JSON字符串再发送
  • 将页面主功能(频道渲染、消息监听、加入/创建频道等逻辑)抽为独立初始化函数,无论走缓存还是新建用户流程,最终都调用该函数加载主页面

修复后的参考代码:

/**
 * 页面主功能初始化函数
 * 所有频道加载、消息收发、交互逻辑都放到这个函数里
 * @param {Object} user - 当前登录用户信息
 */
function initChatApp(user) {
  // 原有页面加载后执行的逻辑全部移到这里,比如渲染频道列表、绑定创建/加入频道事件、建立消息实时同步连接等
  console.log('当前登录用户:', user)
}

// 页面初始化入口
const savedUser = sessionStorage.getItem('user')
if (savedUser) {
  // 命中本地缓存,直接初始化应用
  initChatApp(JSON.parse(savedUser))
} else {
  // 无本地缓存,走新用户创建流程
  const username = prompt('Enter your name')?.trim()
  if (!username) {
    alert('用户名不能为空,请刷新页面重试')
  } else {
    fetch("/welcome/createuser", {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({ username }) // 修正请求体为标准JSON格式
    })
    .then(response => response.json())
    .then(user => {
      sessionStorage.setItem("user", JSON.stringify(user))
      initChatApp(user)
    })
    .catch(err => console.error('用户初始化失败:', err))
  }
}

补充说明:如果需要用户关闭标签页后再打开站点仍然保留登录状态,可以将代码中所有sessionStorage替换为localStorage,前者仅在当前标签页生命周期内生效,关闭标签页自动清除,后者为本地持久化存储,除非手动清除浏览器缓存否则不会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:01:12